思路
找到第一个>=target
以及最后一个<=target
的索引,即找到两个边界(左右边界,二分)。
同时也要考虑特殊情况,如果边界上的值不等于target,说明列表中不含有target,直接返回0
关于二分,之前写过的文章有详细介绍
剑指刷题日记剑指 Offer 11. 旋转数组的最小数字
class Solution {
public:
// 找到第一个大于等于target的下标 (左边界)
// [left, mid], [mid+1, right]
int search_l(vector<int>& nums,int target, int l, int r){
while(l<r){
int mid = (l + r) >> 1;
if(nums[mid]<target)
l=mid+1; // 小于就往右边去
else
r=mid;
}
return l;
}
// 找到最后一个小于等于target的下标 (右边界)
// [left, mid-1], [mid, right]
int search_r(vector<int>& nums, int target, int l, int r){
while(l<r){
int mid = (l+r+1)>>1;
if(nums[mid]>target)
r = mid-1; // 大于就往左边去
else
l = mid;
}
return r;
}
int search(vector<int>& nums, int target) {
if(nums.size()==0){ // 空表
return 0;
}
int l = search_l(nums, target, 0, nums.size()-1);
if(l>=0&&nums[l]!=target){
// 如果边界上的值不等于target,说明列表中不含有target,直接返回0
return 0; // 没有找到该target;
}
int r = search_r(nums, target, 0, nums.size()-1);
return r-l+1;
}
};