剑指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;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章