题目描述
统计一个数字在排序数组中出现的次数。
思路
排序数组查找目标数字出现的次数:
可以用寻找左侧边界的二分查找,定位到左侧边界的索引,然后再往下遍历,得到出现的次数。
寻找最左侧边界的二分搜索
int left_bound(int[] nums, int target) {
if (nums.length == 0) return -1;
int left = 0;
int right = nums.length; // 注意
while (left < right) { // 注意
int mid = (left + right) / 2;
if (nums[mid] >= target) {
right = mid;
} else if (nums[mid] < target) {
left = mid + 1;
}
}
return left;
}
代码实现
当定位到目标元素时,不要立即返回,而是缩小「搜索区间」的上界 right,在区间 [left, mid) 中继续搜索,即不断向左收缩,达到锁定左侧边界的目的。
class Solution {
public int search(int[] nums, int target) {
int left=0;
int right=nums.length-1;
int count=0;
while(left<right){
int mid=(left+right)/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;
}
}