algorithm-binary-search
二分查找
二分查找(Binary Search)是一种高效的搜索算法,适用于有序数组或有序列表。它通过不断地将搜索范围减半来查找目标元素,从而在O(log n)的时间复杂度内找到特定元素的位置。
在有序数组中找到中间位置的元素,与目标元素进行比较。如果中间元素等于目标元素,则搜索成功;如果中间元素大于目标元素,则在数组的左半部分继续进行二分查找;如果中间元素小于目标元素,则在数组的右半部分进行二分查找。通过不断重复这个过程,直到找到目标元素或搜索范围缩小到为空为止。
基本模板
找到大于等于target的第一个数(最左边)
nums = [1, 2, 4, 5, 5, 6], target = 5
-> l = 3
1 | int l = 0, r = n; |
找到大于target的第一个数
1 | int l = 0, r = n; |
找到小于等于target的最后一个数(最右边)
nums = [1, 3, 3, 5, 7, 9], target = 5
-> l = 2
1 | int l = -1, r = n-1; |
找到小于target的最后一个数
nums = [1, 3, 3, 5, 7, 9], target = 5
-> l = 2
1 | int l = -1, r = n-1; |
模板中可以diy的地方主要有两个:
- 首先是
m = l + (r-l)/2
和m = l + (r-l+1)/2
- 如果是
m = l + (r-l+1)/2
的话,那么还需要修改l = m
andr = m-1
,否则无法结束循环 - 两者的区别主要体现在,当到达临界值时,左式取m偏右一位,所以得到的是大于或者大于等于的第一个数;而右式取m偏左一位
- 如果是
- 还有就是是否取等号
if (nums[m] < target)
和if (nums[m] <= target)
,是否需要大于等于或者小于等于
- 35. 搜索插入位置:找到大于target的第一个数
- 704. 二分查找:找到大于等于target的第一个数 或者 找到小于等于target的最后一个数
- 275. H 指数 II:条件映射 + 大于等于或者小于等于
最小化最大值 或 最大化最小值 问题
看到「最大化最小值」或者「最小化最大值」就要想到二分答案,这是一个固定的套路。
- 2560. 打家劫舍 IV(2081)
- 1631. 最小体力消耗路径(1948)
- 3399. 字符相同的最短子字符串 II: 最小化最大值,二分,单独考虑答案等于1的情况
- 3419. 图的最大边权的最小值: 脑筋急转弯 + 二分 + bfs
与其他算法结合
- 3292. 形成目标字符串需要的最少字符串数 II:字符串哈希+二分+贪心
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BUGHERE の 博客!
评论