題目:對於一個非遞減數組A,存在A[i]=i,求o(lgn)的算法找出i,
分析:
1,對於任意的j和i,如果j>i則A[j]>=A[i];
2,假設所求的解是I,即A[I]=I,則對任意的j,如果A[j]>j,可以得到I<j,如果A[j]<j,則j<I,如果A[j]=j,則j=I(不考慮I的多解情況).
利用2可以得到下面的算法:
public static int search(int[] A) {
int len = A.length;
int start = 0;
int end = len;
while (start <= end) {
int j = (start + end) / 2;
if (A[j] == j) {
return j;
}
if (A[j] > j) {
end = j - 1;
} else if (A[j] < j) {
start = j + 1;
}
}
return -1;
}
解析:
當A[j]>j時,拋棄[j,end]的區間,當A[j]<j時,拋棄[start,j]的區間
歡迎網友的指導。