I题目描述:

统计一个数字在排序数组中出现的次数。

解析:

1.二分法,定义左右边界left和right,定义数字在数组中出现的次数count
2.while循环,左边界小于有边界时,定义中间节点mid
当nums[mid]大于等于目标值时,则右边界为中间节点
当nums[mid]小于目标值时,则左边界为中间节点加一
3.while循环确定好左右边界后
然后再while循环,当左边界小于数组的长度并且nums[left]等于目标值时,则count++
4.最后返回count即可

Java:

public int search(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        int count = 0;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] >= target) {
                right = mid;
            } else if(nums[mid] < target) {
                left = mid + 1;
            }
        }
        while(left < nums.length && nums[left++] == target) {
            count++;
        }
        return count;
    }

JavaScript:

var search = function(nums, target) {
    let left = 0, right = nums.length - 1;
    let count = 0;
    while(left < right) {
        let mid = Math.floor(left + (right - left) / 2);
        if(nums[mid] >= target) {
            right = mid;
        } else if(nums[mid] < target) {
            left = mid + 1;
        }
    }
    while(left < nums.length && nums[left++] === target) {
        count++;
    }
    return count;
};

II题目描述:

一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。

解析:

1.二分法,定义左右边界left和right,然后while循环左边界小于右边界时,定义中间节点mid
2.如果nums[mid]等于mid时,则左边界等于mid + 1,否则右边界为mid
3.最后返回right即可

Java:

public int missingNumber(int[] nums) {
        int left = 0, right = nums.length;
        while(left < right) {
            int mid = left + (right - left) / 2;
            if(nums[mid] == mid) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return right;
    }

JavaScript:

var missingNumber = function(nums) {
    let left = 0, right = nums.length;
    while(left < right) {
        let mid = Math.floor(left + (right - left) / 2);
        if(nums[mid] == mid) {
            left = mid + 1;
        } else {
            right = mid;
        }
    }
    return right;
};