最近开始刷LeetCode,第一天就是二分查找,说是简单题型,但对于我这样一个平时不练习,期末靠背的混子来说,简直难的不要不要的。所以我先给大家一个建议哈,那就是多刷题多总结。
废话不多说。
我们知道,二分查是通过一个中间下标mid来与目标值进行比较,如果中间下标所在值比目标值小,那么目标值在mid左边,如果中间下标比目标值大,那么目标值在mid右边,否则,正好是目标值。
有一个有序数组 int[] arr = {-1,3,6,9,11}
目标值是 target = 9
我们定义三个指针(其实不是指针,就是下标,这么描述是为了方便理解)
low = 0, high = 4, mid = low + (high - low) / 2(这么做是防止整数溢出),
第一遍循环开始,arr[mid]=6,比target小,这时候我们就要将左指针low变成mid+1也即3(为什么不是mid呢?因为9比6大,6不是我们需要的,所以要后移一位),这时候第一遍循环已经结束。
第二遍循环重新计算一下mid=3,那么arr[mid]=9,已经找到了,直接返回mid即可。
如果找不到,就返回-1。
循环的结束条件就是low <= high(这里需要等于,因为查找的可能是数组边界值,只有[low,high]闭区间才能包含这个边界值)
下面附上代码:
public class BinarySearch {
public static void main(String[] args) {
int[] nums = {-1,3,3,5,9,12};
int target = 12;
System.out.println(search(nums,target));
}
private static int search(int[] nums, int target) {
int low = 0, high = nums.length - 1;
while (low <= high){
int mid = low + (high - low) / 2;
if (target > nums[mid]){//目标值比中间值大
low = mid + 1;
}
else if(target < nums[mid]){//目标值比中间值小
high = mid - 1;
}
else return mid;//一样大就返回下标
}
return -1;
}
}