学习目标:
- 掌握二分查找
学习内容:
- 掌握左闭右开区间的使用方式
- 掌握 左闭右闭区间的使用方式
1. 左闭右闭区间
举例:[1,1]
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
/**
* 左闭右闭原则 例如[1,1]
*/
public int binarySearch1(int[] nums,int target){
int left = 0;
// 既要包含左边区间,又要包含右边区间
int right = nums.length - 1;
while(left <= right){
// 防止出现角标越界的情况出现
int mid = left + (right - left) / 2;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){ //右区间向左边移动
// 1.遵循统一原则,上面是左闭右闭区间,下面也必须遵循
// 2.上面的nums[mid]已经进行了判断,不可以进行重复判断
right = mid - 1;
}else{
left = mid + 1;
}
}
return -1;
}
2.左闭右开原则
- 举例: [1,1}
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
/**
* 左闭右开原则 [1,1)
* @param nums
* @param target
* @return
*/
public int binarySearch2(int[] nums,int target){
int left = 0;
int right = nums.length;
// 只需要包含左区间,不需要包含右区间
while (left < right){
int mid = (right - left) / 2 +left;
if(nums[mid] == target){
return mid;
}else if(nums[mid] > target){ //右区间向左边移动
// 1.遵循统一原则,上面是左闭右闭区间,下面也必须遵循
// 2.上面的nums[mid]由于角标多出一位,所有nums[mid]没有进行判断,需要进行判断
right = mid;
}else{
left = mid + 1;
}
}
return -1;
}