1. 程式人生 > >帶有重複元素的有序陣列二分查詢

帶有重複元素的有序陣列二分查詢

在牛客上看到這樣一道題:

題目描述

統計一個數字在排序陣列中出現的次數。      一般首先會想到順序遍歷一遍,時間複雜度o(n),如果這麼簡單,這道題就沒什麼必要出了。  其實這道題也很容易想到二分查詢,時間複雜度為o(logn),但是二分查詢需要注意一個細節,就是當遇到重複元素時,讓mid指標跳過所有重複元素,這也是很多粗心的小夥伴非常容易忽略的,也 是很多面試官喜歡問的一個查詢問題,下面附上程式碼: 因為最近在鞏固node,所以演算法都是用js來寫的:
function GetNumberOfK(data, k)
{
    // write code here
    var l = 0,r = data.length,mid;
    while(l < r){
        mid = Math.floor((l+r)/2);
        if(data[mid] < k ){
            while(data[mid] == data[mid+1]){
                mid++;
            }
            l = ++mid;
        }else if(data[mid] > k){
            while(data[mid] == data[mid-1]){
                mid--;
            }
            r = --mid;
        }else{
            var sign1 = mid,sign2 = mid;
            while(sign1 <= r && data[sign1] == data[sign1+1]){
                sign1++;
            }
            while(sign2 >= l && data[sign2] == data[sign2-1]){
                sign2--;
            }
            return sign1-sign2+1;
        }
    }
    return 0;
}
module.exports = {
    GetNumberOfK : GetNumberOfK
};