已知数组A[0..n-1]和数组大小n(升序数组,元素值各不相同),若存在A[i]=i则称该数组有魔术索引,请判断该数组是否存在魔术索引,返回值为bool,要求复杂度优于o(n)。
测试样例:
[1,2,3,4,5]
返回:false
一、常规法
class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
if(0 == n) return false;
int i;
for(i = 0; i < n;){
if(A[i] == i) return true;
else if(A[i] < i) ++i;
else i = A[i] + 1;
}
return false;
}
};
时间复杂度略小于O(n)。
二、二分法
class MagicIndex {
public:
bool findMagicIndex(vector<int> A, int n) {
// write code here
if(n == 0) return false;
int l = 0, r = n;
while(l <= r){
int mid = (l+r) >> 1;
if(A[mid] > mid) r = mid-1;
else if(A[mid] < mid) l = mid+1;
else return true;
}
return false;
}
};
时间复杂度O(logn)。