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;
};