template
public void binarySearch1(int[] nums){
int l = 0 ;
int r = nums.length - 1;
while9 ( l < r ){
int mid = l + r >> 1 ;
if( check(mid) ) r = mid ;
else l = mid + 1;
}
return l;
}
public void binarySearch2(int[] nums){
int l = 0 ;
int r = nums.length - 1 ;
while( l < r ) {
int mid = l + r + 1 >> 1;
if( check(mid) ) l = mid ;
else r = mid - 1 ;
}
}
二分性质
二分法常用来处理有序数组,是因为有序数组具有的朴素的二分性质,可以按照任意的target划分左右区间
含有不重复元素的有序数组处理
nums[] = [1,2,3,6,7,8]; target = 6
public int binarySearch1(int[] nums){
int l = 0;
int r = nums.length-1;
while( l < r ){
int mid = l + r >> 1;
if( nums[mid] >= target ) r = mid;
else l = mid + 1 ;
}
if( nums[r] == target ) return r ;
return -1;
}
// 模板一和模板二在处理无重复元素的时候没有区别
public int binarySearch(int[] nums){
int l = 0 ;
int r = nums.length - 1 ;
while( l < r){
int mid = l + r + 1 >> 1;
if(nums[mid]<=target) l = mid ;
else r = mid -1 ;
}
if(nums[l] == target) return l;
return -1;
}
含有重复元素的有序数组处理
nums[] = [1,2,3,4,4,4,5,5,6] ; target = 4
// 模板1会找到 4 4 4 中第一个4
public void binarySearch(int[] nums){
int l = 0 ;
int r = nums.length - 1 ;
while( l < r ){
int mid = l + r >> 1;
if( nums[mid] >= target ) r = mid; // 本质上是将大于等于目标值的所有值划分为右区间
else l = mid + 1;
}
if( nums[l] == target ) return l;
return -1;
}
// 模板2会找到 4 4 4 中最后一个4
public void binarySearch(int[] nums){
int l = 0 ;
int r = nums.length - 1 ;
while( l < r ){
int mid = l + r + 1 >> 1;
if( nums[mid] <= target ) l = mid; // 本质上是将小于等于目标值的所有值划分为左区间
else r = mid - 1;
}
if( nums[l] == target ) return l;
return -1;
}