今天是十二月的第一天,每个月的第一天都代表新的开始.哈哈哈:)
纪念11月的打卡情况
今天遇到了二分查找上下界的一些问题,但是想了想还是没写出来lower_bound和upper_bound的源码.只能再次翻开紫书了~~
代码如下:已经有详细的注释啦!
class Solution {
public:
int lowerbound(int low,int high,vector<int>& nums,int target){
//返回target第一次出现的位置 如果不存在,返回这样一个下标i:在此处插入target后序列依然有序
//查找范围为[low,high) 但是返回的范围是[low,high] 因为如果target大于nums[high-1] 则只能在最后面插入
/*分析nums[mid]与target的关系
nums[mid]>target:所求位置不会在mid后面,但可能会是mid 因此high=mid,返回区间为[low,mid]
nums[mid]==target:已经找到与target相等的值,但是左边可能还会有与target相等的,因此high=mid,返回区间为[low,mid]
nums[mid]<target:所求的位置不可能在mid和mid左边,因此low=mid+1 返回区间为[mid+1,high]
*/
while(low<high){
int mid=(high-low)/2+low;
if(nums[mid]>=target) high=mid;
else low=mid+1;
}
return low;
}
int upperbound(int low,int high,vector<int>& nums,int target){
//返回target出现的最后一个位置的下一个位置.如果不存在,返回这样一个下标i:在此处插入target后序列依然有序
//范围与上面同理
/*分析nums[mid]与target的关系
nums[mid]>target:所求位置不会再mid后面,但可能会是mid 因此high=mid 返回区间为[low,mid]
nums[mid]==target:已经找到与target相等的值,但右边可能还会有与target相等的,因此low=mid+1(因为是下一个位置),返回区间为[mid+1,high]
nums[mid]<target:所求位置不可能为mid和mid左边,因此low=mid+1,返回区间为[mid+1,high]
*/
while(low<high){
int mid=(high-low)/2+low;
if(nums[mid]<=target) low=mid+1;
else high=mid;
}
return low;
}
vector<int> searchRange(vector<int>& nums, int target) {
//二分查找
int index1=lowerbound(0,nums.size(),nums,target);
int index2=upperbound(0,nums.size(),nums,target)-1;
vector<int> res={-1,-1};
if(index1==index2) return res;
else{
res[0]=index1;res[1]=index2-1;
return res;
}
}
};