二分搜索模板
搜索区间统一为两端关闭即[left,right]
普通二分搜索
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]>target){
right = mid -1;
}else if(nums[mid]==target){
return mid
}
}
return -1;
}
左侧搜索二分
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){
right = mid - 1;
}else if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]==target){
right = mid -1;
}
if(left>=nums.length||nums[left]!=target){
return -1;
}
return left;
}
}
右侧搜索二分
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){
right = mid -1;
}else if(nums[mid]<target){
left = mid + 1;
}else if(nums[mid]==target){
left = mid + 1;
}
}
if(right<0||nums[right]!=target)
return -1;
return right;
}