一、查找一个数
力扣704
1、区间左闭右闭
int search(vector<int>& nums, int target) {
int n=nums.size();
int left=0,right=n-1; //[left,right] 左闭右闭,right能取到所以为n-1
while(left<=right){ //left=right时是在区间里面的
int mid=left+(right-left)/2;
if(target>nums[mid]){
left=mid+1;
}
else if(target<nums[mid]){
right=mid-1;
}
else if(target==nums[mid]){
return mid;
}
}
return -1;
}
2、区间左闭右开
int search(vector<int>& nums, int target) {
int n=nums.size();
int left=0,right=n; //[left,right) 左闭右开
while(left<right){ //left=right时区间不存在
int mid=left+(right-left)/2;
if(target>nums[mid]){ //target在右区间
left=mid+1;
}
else if(target<nums[mid]){ //target在左区间
right=mid;
}
else if(target==nums[mid]){
return mid;
}
}
return -1;
}
二、查找右边界
int getRightborder(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(target>=nums[mid]){ //找到 target 时不要立即返回,而是增大「搜索区间」的下界 left,使得区间不断向右收缩,达到锁定右侧边界的目的。
left=mid+1;
}else if(target<nums[mid]){
right=mid-1;
}
}
if(right<0 || nums[right]!=target){ //检查是否找到
return -1;
}
return right;
}
三、查找左边界
int getLeftborder(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(target>nums[mid]){
left=mid+1;
}else if(target<=nums[mid]){ //找到 target 时不要立即返回,而是缩小「搜索区间」的上界 right,在区间 [left, mid]中继续搜索,即不断向左收缩,达到锁定左侧边界的目的。
right=mid-1;
}
}
if(left>=nums.size()||nums[left]!=target){ //检查是否找到
return -1;
}
return left;
}
力扣34题完整代码如下:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int rightborder=getRightborder(nums,target);
int leftborder=getLeftborder(nums,target);
if(rightborder==-1 || leftborder==-1) return {-1, -1};
else return {leftborder,rightborder};
}
int getRightborder(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(target>=nums[mid]){
left=mid+1;
}else if(target<nums[mid]){
right=mid-1;
}
}
if(right<0 || nums[right]!=target){
return -1;
}
return right;
}
int getLeftborder(vector<int>& nums, int target){
int left=0,right=nums.size()-1;
while(left<=right){
int mid=left+(right-left)/2;
if(target>nums[mid]){
left=mid+1;
}else if(target<=nums[mid]){
right=mid-1;
}
}
if(left>=nums.size()||nums[left]!=target){
return -1;
}
return left;
}
};