某班级考试成绩按非严格递增顺序记录于整数数组 scores
,请返回目标成绩 target
的出现次数。
示例 1:
输入: scores = [2, 2, 3, 4, 4, 4, 5, 6, 6, 8], target = 4
输出: 3
示例 2:
输入: scores = [1, 2, 3, 5, 7, 9], target = 6
输出: 0
提示:
0 <= scores.length <= 105
-109 <= scores[i] <= 109
scores
是一个非递减数组-109 <= target <= 109
思路:
1、有序数组查找目标值采用二分查找。
2、因为需要查找目标值出现的次数,我们可以通过查找目标值的右边界和左边界,相减即可的结果。
3、比如数组[1,2,3,3,4],我们查找3出现的次数,可以通过查找右边界4的下标和以(target-1)为目标值查找出的右边界也就是2的右边界,第一个3的下标,通过相减即可得出3出现了几次。
代码实现:
class Solution {
public:
int binarySearch(vector<int>& scores, int target)
{
int size = scores.size();
if(size == 0)
return 0;
int low = 0, high = size - 1;
while(low <= high)
{
int mid = low + (high - low) / 2;
if(scores[mid] <= target) //此处的等于号就是为了找到target的右边界
low = mid + 1;
else
high = mid - 1;
}
return low;
}
int countTarget(vector<int>& scores, int target) {
return binarySearch(scores, target) - binarySearch(scores, target - 1);
}
};