二分搜索專題1-在非遞減數組中尋找滿足A[i]=i的i

在javaeye上看到了一個二分搜索相關的提問http://www.iteye.com/topic/1118606,我設計了一個簡潔高效的算法,這裏貼出來:
題目:對於一個非遞減數組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]的區間

歡迎網友的指導。
發佈了56 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章