帶有重複元素的有序陣列二分查詢
阿新 • • 發佈:2018-12-31
在牛客上看到這樣一道題:
題目描述
統計一個數字在排序陣列中出現的次數。 一般首先會想到順序遍歷一遍,時間複雜度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 };