题目
统计一个数字在排序数组中出现的次数。
示例 1:
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
示例 2:
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
- 0 <= nums.length <= 105
- -109 <= nums[i] <= 109
- nums 是一个非递减数组
- -109 <= target <= 109
解题思路
1.题目要求我们统计一个数字在排序数组中出现的次数。看到题的第一眼我们肯定会想去用while循环一个一个的去比较,但是这种暴力的解法会超出时间限制,所以我们可以换一种思路,那就是采用二分法去求解。
2.首先,我们初始化两个变量`left`和`right`,分别表示数组`nums`的起始索引和结束索引。同时,初始化一个变量`count`,用于记录目标值`target`的出现次数。
3. 采用while循环,结束条件是`left < right`,即`left`小于`right`。这个循环用于找到目标值`target`在数组中的起始位置。 在循环体内,首先计算中间位置`mid`,通过`(left+right)/2`得到。接下来,通过判断`nums[mid]`与`target`的大小关系,来更新`left`和`right`的值。如果`nums[mid]`大于等于`target`,则将`right`更新为`mid`,表示目标值`target`可能在左侧或者当前位置。如果`nums[mid]`小于`target`,则将`left`更新为`mid+1`,表示目标值`target`在右侧。 当循环结束后,`left`的值即为目标值`target`在数组中的起始位置。
4. 接下来,进入一个新的while循环,条件是`left < nums.length`,即`left`小于数组`nums`的长度。这个循环用于计算目标值`target`在数组中的出现次数。 在循环体内,首先判断`nums[left]`与`target`是否相等。如果相等,则将`count`的值加1。然后,将`left`的值加1,继续下一次循环。
5. 最后,返回`count`的值,即目标值`target`在数组`nums`中的出现次数。
代码实现
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;
}
if(nums[mid] < target){
left = mid + 1;
}
}
while(left<nums.length&&nums[left++]==target){
count++;
}
return count;
}
}
测试结果