模板 1 - binary_search
- 没有重复元素时,目标值若存在,则返回索引;若不存在,返回 -1
- 存在重复元素时,目标值若存在,则返回最小索引;若不存在,返回 -1
模板 2 - lower_bound
- 返回大于(含等于)目标值的最小索引(第一个大于、等于目标值的索引返回0)
模板 3 - upper_bound
- 返回大于等于目标值的最大索引+1(第一个大于目标值的索引返回3)
注意点:
- 跳出时都有lo + 1 == hi统一返回lo + 1或hi
- lo = -1 and hi = nums.size()和 lo = 0 and hi = nums.size() - 1取中时一致
有时也可取一边开一边闭的区间,注意最后收缩时的情况即可
1 | /*为什么返回 `lo+1`,而不是 `hi`?(退出循环时有 lo + 1 == hi) |
做几道题测试一下,先别看答案。
LeetCode练习:34. Find First and Last Position of Element in Sorted Array
1 | int lowwer_bound(vector<int> nums, int n){ |
LeetCode154. 寻找旋转排序数组中的最小值 II(可重复)
1 | /* |
LeetCode 33. 搜索旋转排序数组
虽然可能通过各种条件判断直接一次二分,但是很容易出错
保险的做法是通过两次二分
先找出最小值的位置(见上题LeetCode 153、154),
然后确定 target 的区间,再用一次二分去找
1 | int search(vector<int>& nums, int target) { |
附上常见的写法,其实本质是一样的:
1 | template<typename T> |
扩展:
1 | /* |