难度:简单
统计一个数字在排序数组中出现的次数。
输入: nums = [5,7,7,8,8,10], target = 8
输出: 2
输入: nums = [5,7,7,8,8,10], target = 6
输出: 0
提示:
nums
是一个非递减数组注意:本题与 34. 在排序数组中查找元素的第一个和最后一个位置 相同(仅返回值不同)。
只要能找出给定的数字 target
在有序数组第一个位置和最后一个位置,就能知道该数字出现的次数。
target
之后,立即返回当前索引下标。
nums[m] >= target
时,在左区间继续查找,左区间应该包含 target
位置。target + 1
的第一个位置,并再往前移动一个位置。需要注意以上实现的查找第一个位置的 binarySearch
方法,right
的初始值为 nums.size()
,而不是 nums.size() - 1
。先看以下示例:
nums = [2,2], target = 2
如果 right
的取值为 nums.size() - 1
,那么在查找最后一个位置时,binarySearch(nums, target + 1) - 1 = 1 - 1 = 0
。
binarySearch
只会返回 [0, nums.size() - 1]
范围的值,对于 binarySearch([2,2], 3)
,我们希望返回 3
插入 nums
中的位置,也就是数组最后一个位置再往后一个位置,即 nums.size()
。right
的取值为 nums.size()
,从而使得 binarySearch
返回的区间更大,能够覆盖 right
大于 nums
最后一个元素的情况。C++
class Solution {
private:
int binarySearch(vector<int>& nums, int target){//查找第一个位置
int left = 0, right = nums.size();
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] >= target){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
public:
int search(vector<int>& nums, int target) {
int first = binarySearch(nums, target);
int last = binarySearch(nums, target + 1);
return (first == nums.size() || nums[first] != target) ? 0 : last - first;
}
};
Java
class Solution {
private int binarySearch(int[] nums, int target){//查找第一个位置
int left = 0, right = nums.length;
while(left < right){
int mid = left + (right - left) / 2;
if(nums[mid] >= target){
right = mid;
}else{
left = mid + 1;
}
}
return left;
}
public int search(int[] nums, int target) {
int first = binarySearch(nums, target);
int last = binarySearch(nums, target + 1);
return (first == nums.length || nums[first] != target) ? 0 : last - first;
}
}
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!