二分法解决数字在有序数组出现的次数

数字在升序数组中出现的次数

http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2

其实也可以用暴力解法,但是时间复杂度为O(N)
用二分法后,其实时间复杂度也为 O(NlogN) + O(N) = O(N)

public class Solution {
    public int GetNumberOfK(int [] array , int k) {
        if(array.length == 0 || k < array[0] || k > array[array.length-1]){
            return 0;
        }
       int left = 0, right = array.length - 1;
        int mid = 0;   
        int count = 0;
        while(left <= right){
            mid = (left + right) / 2;
            if(array[mid] > k){
                right = mid-1;
            }else if(array[mid] < k){
                left = mid + 1;
            }else{
                count++;
                break;
            }

        }

        int pre = mid - 1;
        int foll = mid + 1;

        //统计这个mid左侧
        while(pre >= left){
            if(array[pre] == k){
                count++;
                pre--;
            }else{
                break;
            }
        }
        //统计这个mid右侧
        while(foll <= right){
            if(array[foll] == k){
                count++;
                foll++;
            }else{
                break;
            }
        }
        return count;
    }
}
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务