1、介绍
1、二分查找思路
找到数组中间位置的值与目标值对比、根据结果选择移动的边界(左/右)进而缩小范围
2、条件限制
要求目标数组有序
3、整体思路
1、设置左右边界值、数组中间位置的值(中间值需要放到循环重复定义)
2、创建循环
3、循环对比中间位置值与目标值、移动边界、重新设置中间值、对比
4、难点
1、right的取值:取数组长度-1、还是数组长度 2、while循环条件是否取= 3、左右边界移动后的取值
确定区间:边界取值选择左闭右闭、左闭右开
根据右边的开闭确定取值、如果闭、右边取得到、取得到right=取数组长度-1,while循环条件取=
2、代码实现
左闭右闭
class Solution {
/**
* 二分查找:思想找一个中间值与目标值比较、再不断更新中间值位置
* 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
* @param nums
* @param target
* @return
*
* 核心问题:区间问题:先确定是左闭右闭、还是左闭右开
* 根据区间确定:1、right的取值 2、while循环条件是否取= 3、左右边界移动后的取值
* 注意:mid变量需要放到循环内定义
*/
public int search(int[] nums, int target) {
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length-1;
while(left <= right){
int mid = left + ((right - left) >> 1);
if(target == nums[mid]){
return mid;
}
else if(target<nums[mid]){
right = mid-1;
}else if(nums[mid]<target){
left = mid + 1;
}
}
return -1;
}
}
左闭右开
class Solution {
/**
* 二分查找:思想找一个中间值与目标值比较、再不断更新中间值位置
* 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
* @param nums
* @param target
* @return
*
* 核心问题:区间问题:先确定是左闭右闭、还是左闭右开
* 根据区间确定:1、right的取值 2、while循环条件是否取= 3、左右边界移动后的取值
* 注意:mid变量需要放到循环内定义
*/
public int search(int[] nums, int target) {
if(target < nums[0] || target > nums[nums.length-1]){
return -1;
}
int left = 0;
int right = nums.length;
while(left < right){
int mid = left + ((right - left) >> 1);
if(target == nums[mid]){
return mid;
}
else if(target<nums[mid]){
right = mid;
}else if(nums[mid]<target){
left = mid + 1;
}
}
return -1;
}
}