二分搜索算法模板
0.二分搜索框架
int binarySearch(int[] nums,int target){
int left = 0,right = ...;
while(...){
int mid = left + (right - left)/2;
if(nums[mid] < target){
...
}else if(nums[mid] > target){
left = ...;
}else if(nums[mid] < target){
right = ...;
}
}
return ...;
}
注:代码中left + (right - left)/2和(left + right)/2结果是相同的,我们之所以使用left + (right - left)/2是因为当left和right太大时,防止溢出。
1.最基本的二分搜索算法
int binary_search(int[] nums,int target){
int left = 0,right = nums.length - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > targrt){
right = mid - 1;
}else if(nums[mid] == target){
//直接返回
return mid;
}
}
//直接返回
return -1;
}
2.寻找左侧边界的二分搜索算法
int left_bound(int[] nums,int target){
int left = 0,right = nums.length - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] == target){
// 收缩右边界,锁定左侧边界
right = mid - 1;
}
// 检查left越界的情况
if(left >= nums.length || nums[left] != target){
return -1;
}
return left;
}
}
3.寻找右边界的二分搜索算法
int right_bound(int[] nums,int target){
int left = 0,right = nums.length - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(nums[mid] < target){
left = mid + 1;
}else if(nums[mid] > target){
right = mid - 1;
}else if(nums[mid] == target){
// 收缩左边界,锁定右侧边界
left = mid + 1;
}
}
// 检查right越界的情况
if(right < 0 || nums[right] != target){
return -1;
}
return right;
}