排序数组中的搜索问题 ->二分法
class Solution {
public:
int search(vector<int>& nums, int target) {
int i = 0, j = nums.size()-1;
//查找右边界
while(i<=j){
int mid = i + (j-i)/2;
if(nums[mid] <= target) i = mid+1;
else j = mid-1;
}
int right = i;
//数组中没有该值直接返回
if(j>=0 && nums[j]!=target) return 0;
i = 0;
while(i<=j){
int mid = i +(j-i)/2;
if(nums[mid] >= target) j = mid-1;
else i = mid+1;
}
int left = j;
return right-left-1;
}
};
改进算法:可将以上思路改写为分别查找target和target-1的有边界,将两结果相减并返回即可。
class Solution {
public:
int search(vector<int>& nums, int target) {
return helper(nums, target)- helper(nums, target-1);
}
private:
int helper(vector<int>& nums, int target){
int i = 0, j = nums.size()-1;
while(i <= j){
int mid = i + (j-i)/2;
if(nums[mid] <= target) i = mid+1;
else j = mid-1;
}
return i;
}
};