二分查找
两个二分查找模板
二分查找是比较重要的一个算法思想,这里使用两个二分法的模板来解释二分查找的细节问题。
目标:对于数组nums
,要找到target
的下标位置
模板一:边界外
二分模板如下:
1 | // 1、初始条件需要卡在0和nums.length-1之外 |
问题1:为什么边界条件要设置在数组的外边?
因为如果整个数组都<
或>
预期值target
,我们的l
与r
边界就会出现问题
问题2:循环条件为什么是
l + 1 != r
,我用l < r
不行吗?
假设有三种情况:
1 | ... L R ... // 情况1:: L + 1 == R 成立,不会进入循环 |
如果我们的循环条件是l < r
,对于情况1会进入循环,这是两种条件的区别。
现在我们求这道题:对于数组nums
,要找到target
的下标位置
由此我们可以快速的得出:
1 | int l = -1; |
此处我们的条件是nums[m] < target
,我们的结果就会变成:
1 | ....lr.... |
l
及其左边都是<target
的数值;r
及其右边都是>= target
的数值,因此我们要求target
的位置就应该选择返回r
同理,如果你的条件是<= target
,那么就应该返回l
在思考到底要返回l还是r时,我们可以脑海构建一个 类似...lr...
的图,结合条件,就可以立马反应我们该返回哪一个值了。
Exec:
模板二:边界上
适合解决旋转有序数组的问题。
1 | // 1、初始条件卡在边界 |
Exec: