二分查找target出现的位置 不存在返回-1
int binSerch(vector<int> nums, int target){
int left = 0;
int right = nums.size()-1;
while(left<=right){
int mid = left + ((right-left)>>1); //防溢出
if(nums[mid] == target){
return mid;
}
else if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] > target){
right = mid - 1;
}
}
return -1;
}
二分查找target的左边界,不存在target返回-1
int left_bound(vector<int> nums, int target){
int left = 0;
int right = nums.size()-1;
while(left <= right){
int mid = left + ((right-left)>>1);
if(nums[mid]==target){//缩短右边界
right = mid - 1;
}
else if(nums[mid]<target){
left = mid + 1;
}
else if(nums[mid]>target){
right = mid - 1;
}
}
if(left>nums.size()-1||nums[left]!=target){
return -1;
}
return left;
}
二分查找target的右边界,不存在target返回-1
int right_bound(vector<int> nums, int target){
int left = 0;
int right = nums.size()-1;
while(left<=right){
int mid = left + ((right-left)>>1);
if(nums[mid]==target){//缩短左边界
left = mid + 1;
}
else if(nums[mid] < target){
left = mid + 1;
}
else if(nums[mid] > target){
right = mid - 1;
}
}
if(right<0||nums[right]!=target){
return -1;
}
return right;
关于left_bound()
最后↓
if(left>nums.size()-1||nums[left]!=target)
return -1;
else
return left;
怎么理解?
- 对于数组[1,1,2,2,2,3,3,5,5]:
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
值 | 1 | 1 | 2 | 3 | 3 | 3 | 4 | 4 | 5 |
- 查找
target
为0,1,2,3,4,5,6
的left
值,对比函数left_bound()应返回的结果
结果如下:
target | 0(不存在) | 1(边界值) | 2 | 3 | 4(不存在) | 5(边界值) | 6(不存在) |
---|---|---|---|---|---|---|---|
left | 0 | 0 | 2 | 5 | 7 | 7 | 9 |
应返回值 | -1 | 0 | 2 | 5 | -1 | 7 | 9 |
- 因此当
left>nums.size()-1||nums[left]!=target
的时候应返回-1 - left_bounf函数同理
if(right<0||nums[right]!=target)
return -1;
else
return right;