闭区间
<=
mid + 1, mid - 1;
int binarySearch(vector<int> nums, int target){
//闭区间[]
int left = 0;
int right = nums.size() - 1;
// <=
while(left <= right){
int mid = left + (right - left) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] < target) left = mid + 1;
else if(nums[mid] > target) right = mid - 1;
}
return -1
}
开区间
<
第一个mid, 第二个mid + 1/ mid - 1
int binarySearch(vector<int> nums, int target){
int left = 0;
int right = nums.size();
while(left < right){
int mid = mid + (right - left) / 2;
if(nums[mid] == target) return mid;
else if(nums[mid] < target) left = mid;
else if(nums[mid] > target) right = mid - 1;
else if(nums[mid] > target) right = mid;
else if(nums[mid] < target) left = mid + 1;
}
}
二分查找(找一个确定的值)
基本
int binarySearch(vector<int> nums, int target){
int l = 0;
int r = nums.size() - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(nums[mid] == target){
return ans;
}else if(mid > target) {
r = mid - 1;
}else if{
l = mid + 1;
}
}
return -1;
}
左边界
int binarySearch(vector<int> nums, int target){
int ans = -1;
int l = 0;
int r = nums.size() - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(nums[mid] == target){
r = mid - 1;
ans = mid;
}else if(nums[mid] > target) {
r = mid - 1;
}else if(nums[mid] < target){
l = mid + 1;
}
}
return ans;
}
右边界
int binarySearch(vector<int> nums, int target){
int ans = -1;
int l = 0;
int r = nums.size() - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(nums[mid] == target){
l = mid + 1;
ans = mid;
}else if(nums[mid] > target) {
r = mid - 1;
}else if(nums[mid] < target){
l = mid + 1;
}
}
return ans;
}
int binarySearch(vector<int> nums, int target){
int l = 0;
int r = nums.size() - 1;
while(l <= r){
int mid = l + (r - l) / 2;
if(!check()){
l = mid + 1;
}
else if(check()){
ans = mid;
r = mid - 1;
}
}
return ans;
}
一些参考文章GTAlgorithm极客时间https://blog.csdn.net/qq_41221520/article/details/108277801两种模板、几点区分两种情况闭区间<=mid + 1, mid - 1;int binarySearch(vector<int> nums, int target){ //闭区间[] int left = 0; int right = nums.size() - 1;