程序员面试金典——11.3元素查找

程序员面试金典——11.3元素查找

Solution1:我的答案
二分查找,貌似不咋好啊

class Finder {
public:
    int findElement(vector<int> A, int n, int x) { //二分法
        // write code here、
        if(n <= 0)
            return -1;
        int low = 0, high = n - 1;
        return BinarySearch(A, low, high, x);
    }

    int BinarySearch(vector<int> &A, int low, int high, int x) {

        int mid = (low + high)/2;
        if(low > high) //递归终止
            return 0;
        if(A[mid] == x) //答案
            return mid;
        else {
            return BinarySearch(A, low, mid - 1, x)
                + BinarySearch(A, mid + 1, high, x);
        }
    }
};

Solution2:
加强版二分查找
这个思路要学习一个啊

二分查找的加强版,主题思路还是二分,再加上一些限制条件
int findElement(vector<int> A, int n, int x) {
        int i=0,j=n-1,mid;
        //由于移位了,但移位之后,中间元素的左右两边必定有一边是升序的
        while(i<=j) {
            mid=(i+j)/2;
            if(A[mid]==x)
                return mid;
            if(A[mid]<x) {
                //A[mid]<A[left] 说明右边是有序的,且x>A[right]说明x在mid左边
                if(A[mid]<A[i]&&x>A[j]) j=mid-1;
                else i=mid+1;
            }
            else {
                //A[mid]>A[left]说明左边是有序的,且x<A[left],说明x在mid右边
                if(A[mid]>A[i]&&x<A[i]) i=mid+1;
                else j=mid-1;
            }
        }
        return -1;
}

猜你喜欢

转载自blog.csdn.net/Allenlzcoder/article/details/80076059