劍指offer 53_在排序數組中查找數字(java)

面試題53 - I. 在排序數組中查找數字 I

統計一個數字在排序數組中出現的次數。

考察如何優化 查找算法!

思路 二分查找

採用二分查找, 找出目標元素地左右邊界。

  • 時間 O(NlogN)
public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        // 二分查找 給定元素的左右邊界: 結果等於 (high - low +1)
        if(array.length <=0) return 0;
        int i = 0;
        int j = array.length -1; 
        // 二分法確定右邊界(最後一個該元素的位置)
        while(i <= j){
            int mid = i+ (j - i) / 2;
            // 等於k的時候也要右移, 不斷逼近右邊的邊界。
            if(array[mid] <= k){
                i = mid + 1;
            }else{
                j = mid - 1;
            }
        }
        int high = i; // 右邊界確定。
        
        // 確定左邊界
        i = 0;
        j = array.length -1;
        while(i <= j){
            int mid = i + (j -i) / 2;
            // 等於的時候右指針不斷地往左移動, 直到找到第一個與之相等地元素,即確定左邊界。
            if(array[mid] >= k) j = mid-1;
            else i = mid + 1;
        }
        int low = j;// 左邊界確定。
        // (high 和low 在判斷邊界條件的時候都多加了一次, 所以最後結果要減掉1)
        return high - low -1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章