程序员面试金典——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:
加强版二分查找
参考网址:https://www.nowcoder.com/profile/1982673/codeBookDetail?submissionId=17308116
这个思路要学习一个啊
二分查找的加强版,主题思路还是二分,再加上一些限制条件
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;
}