已知一个数组A[0..n-1]和其大小n(不下降序列,元素值可能相同),判断是否存在A[i]=i,返回值为bool,要求时间复杂度小于o(n)。
测试样例:
[1,1,3,4,5]
返回:true
一、常规法
class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
if(n == 0) return false;
for(int i = 0; i < n;){
if(A[i] == i) return true;
else if(A[i] < i) ++i;
else i = A[i];
}
return false;
}
};
二、二分法
class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
return find(A, 0, n-1);
}
bool find(vector<int> A, int sta, int end){
if(sta > end) return false;
int i = sta+end >> 1;
if(A[i] == i) return true;
return find(A, sta, i-1) || find(A, i+1, end);
}
};