本人是刷《代码随想录》这本书时记录一下自己的学习笔记
力扣题
二分法使用条件
1、数据是有序的;
2、数据无重复;
3、利用二分法查找目标值;
二分法的类型
注意区间的定义:左闭右开型、左闭右闭型
左闭右开型[left,right)
注意数组的右指针,是指这数组最后一个元素的后一个位置,所以当代码里面的while()left和right的比较时得是left<right , 因为如果目标值是11,数组就不会像left<=right那样使指针指向索引7,导致索引越界
还有得注意当右指针变化时,right=mid,因为在比较完后mid指向的值就不可用了
代码如下:
public int search(int[] nums, int target) {
//有序的、找目标值、无重复元素
int i = 0;
int j = nums.length;
while(i<j){
int mid = (i+j)>>1;
if(nums[mid] > target){
j = mid;
}else if(nums[mid] < target){
i = mid+1;
}else{
return mid;
}
}
return -1;
}
左闭右闭型
这个的区间是[left,right],这个区间是有意义的,所以while(left<=right)
还有就是right指针这次修改成指向的是mid-1,因为当mid被检验后,就可以不用再被检验
代码如下:
public int search(int[] nums, int target) {
//有序的、找目标值
int i = 0;
int j = nums.length-1;
while(i<=j){
int mid = (i+j)>>1;
if(nums[mid] > target){
j = mid-1;
}else if(nums[mid] < target){
i = mid+1;
}else{
return mid;
}
}
return -1;
}
总结
1、二分查找注意区间的定义while(left<right)或while(left<=right)
2、处理好right的值 right = mid 或 right = mid-1 , 两种情况的确定有一个技巧,right变化后的指针是否还需要用,在左闭右开型中right的值不能用,所以是mid;左闭右闭型right的值还需要使用,所以是mid-1;