帶有重複元素的有序數組二分查找

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

題目描述

統計一個數字在排序數組中出現的次數。
     一般首先會想到順序遍歷一遍,時間複雜度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
};


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章