java 二分搜索变种

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

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

public class Solution {
    public static int GetNumberOfK(int [] array , int k) {
        // right为大于k的第一位
        int right = b_search(array, k);
        // left为大于k-1的第一位,实际上就是等于k的第一位(若存在等于k),不存在k的话就和right一样了
        int left = b_search(array, k-1);
        System.out.println(right);
        System.out.println(left);
        return right - left;
    }

    private static int b_search(int[] array, int k){
        // 这里j一定要设为数组长度, 这样在数组中存在k时,仍然可以返回大于k的第一位
        // 要是设置为array.length-1,那么当数组中存在k时,返回的是等于k的最后一位,而不是大于k的第一位
        int i = 0, j = array.length;
        // 同时终止条件为i == j
        while(i < j){
            // mid 向下取整
            int mid = i + (j - i) /  2;
            if(array[mid] <= k){
                i = mid + 1;
            }else{
                j = mid;
            }
        }
        // 返回的是大于k的第一位,若数组中不存在,就是数组的最后一位加一
        return i;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务