1.使用二分法的前提:数组为有序数组 , 数组中无重复元素
2.二分法查找又叫折半查找,先定义三个指针(left,right,middle),left指向数组的第一个元素,right指向数组的最后一个元素,middle指向(left+right)/2,然后进行查找,如果target(值) > nums[middle],则改变left值,在后半部分再进行二分法查找;如果target < nums[middle],则改变right值,在前半部分再进行二分法查找。注意:left,right和middle都是数组的下标
3.易错:对区间的定义要想清楚,区间的定义就是不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则。掌握while(left < right)
和 while(left <= right)
,以及right = middle和
right = middle - 1
第一种写法:(左闭右闭区间while(left <= right))
package pro1;
public class MyCode {
public static int getIndex(int[] nums,int target) {
//初始化最小值的索引为0
int left = 0;
//初始化最大值的索引为nums.length-1
int right = nums.length - 1;
//首尾相加再除以2得出中间索引
int mid = (left + right) / 2;
while (left<=right) { //说明是左闭右闭区间,例如[1,1]
if (target > nums[mid]) { //明确说明target > nums[mid],就不能包含mid,所以left=mid+1
//如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
left = mid + 1;
} else if (target < nums[mid]) {
//如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
right = mid - 1;
} else {
//剩余的情况就是查询到了结果,那么就直接返回索引。
return mid;
}
mid = (left + right) / 2;
}
//没有查询到,则返回-1
return -1;
}
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
//定义需要查询的值
int target = 9;
int index= getIndex(nums,target);
System.out.println("查询值所对应的索引为:" + index);
}
}
第二种写法:(左闭右开区间while(left <right))
package pro1;
public class MyCode {
public static int getIndex(int[] nums,int target) {
//初始化最小值的索引为0
int left = 0;
//初始化最大值的索引为nums.length,如果nums.length为5,则表示数组nums中有5个元素,其索引分别为0、1、2、3和4。
int right = nums.length; //左闭右开区间如[1,2),所以right可以等于nums.length,因为不会取nums.length
//首尾相加再除以2得出中间索引
int mid = (left + right) / 2;
while (left < right) { //说明是左闭右闭区间,例如[1,1]
if (target > nums[mid]) { //明确说明target > nums[mid],就不能包含mid,所以left=mid+1
//如果查询的值比中间值大,则往右边区域找,就把最小索引改为中间索引右移一位
left = mid + 1;
} else if (target < nums[mid]) {
//如果查询的值比中间值小,则往左边区域找,就把最大索引改为中间索引左移一位
right = mid ; //因为是左闭右开区间,所以right = mid不会包含mid
} else {
//剩余的情况就是查询到了结果,那么就直接返回索引。
return mid;
}
mid = (left + right) / 2;
}
//没有查询到,则返回-1
return -1;
}
public static void main(String[] args) {
int[] nums = {-1, 0, 3, 5, 9, 12};
//定义需要查询的值
int target = 9;
int index= getIndex(nums,target);
System.out.println("查询值所对应的索引为:" + index);
}
}