1、二分查找法的核心
很多人没有抓住二分法的核心,使用二分查找的前提是有序、无重复,满足这两点以后,就可以考虑使用二分法来解决问题。而二分法的核心是边界区间的处理,理解好边界区间的概念,才是最最重要的。
2、边界区间的处理
首先要理解区间的概念,区间可以简单理解为从start到end。
一个数组,从下标0开始,到任意大于0的下标结束,是一个区间。
而二分法中,区间一般分为左闭右闭[left,right],以及左闭右开[left,right),并且在查找中这个区间的数值是动态变化的;取中间值middle=(left+right)/2,利用middle去数组中对比数据,主要分三种情况:
1、当nums[middle]>target时,那么middle右边可以砍掉了,最新的right为middle-1,此时边界区间为[left,middle-1]
2、当nums[middle]<target时,那么middle左边可以砍掉了,最新的left为middle+1,此时边界区间为[middle+1,right]
3、当nums[middle] = =target时,直接返回middle下标
3、原题讲解
LeetCode原题704,给定一个整形数组nums,在nums中寻找目标target,如果目标值存在则返回下标,不存在则返回-1。思路如下:
数组起始下标为left,终点下标为right,中间下标为middle;以middle去一一对比,首先判断middle与target值的大小对比。
-- 如果nums[middle]>target,则right=middle-1.
-- 如果nums[middle]<target,则left=middle+1.
-- 如果nums[middle]==target,则返回middle.
-- 如果不存在,则return -1.
要注意的是,边界left和right是随着判断结果,动态变化的,这是关键,下面是代码
class Solution {
public int search(int[] nums, int target) {
//[left,right]
int left =0;
int right = nums.length-1;
while (left<=right){
int middle = (left+right)/2;
if(nums[middle] > target){
right = middle-1;
}
else if(nums[middle] < target){
left = middle+1;
}
else if (nums[middle] == target){
return middle;
}
}
return -1;
}
}
4、总结
后续会不断的精简、并推出一系列的数据结构与算法的讲解,很多概念性的知识可以自行百度,这里适用于有一定基础的同学,有讲错的地方希望大家指出,感谢!