文章阅读
思路
前提: 已排序数组
思路:
- 从已经排好序的数组或区间中取出中间位置的元素,判断该元素是否满足要搜索的条件,如果满足,停止搜索,程序结束。
- 如果正中间的元素不满足条件,则从它两边的区域进行搜索。由于数组是排好序的,可以利用排除法,确定接下来应该从这两个区间中的哪一个去搜索。
- 通过判断,如果发现真正要找的元素在左半区间的话,就继续在左半区间里进行二分搜索。反之,就在右半区间里进行二分搜索。
难点: 判断逻辑,什么时候返回
基本的二分查找
题目: 从一个排好序的数组里 {1, 3, 4, 6, 7, 8, 10, 13, 14}查看一下数字 8 是否在里面,如果在,返回它的下标,否则返回 -1。
递归实现:
1 |
|
迭代实现:
1 | int binarySearch_iteration(const vector<int> &nums, int target, int low, int high) { |
查找确定的边界
题目: 输入的数组是:{1, 3, 4, 6, 8, 8, 8, 13, 14},目标数是 8,那么返回 {4, 6},其中 4 是 8 第一次出现的下标位置,6 是 8 最后一次出现的下标位置。
迭代实现:
1 | // 下边界 |
查找模糊的边界
题目: 从数组 {1, 3, 4, 6, 7, 8, 10, 13, 14}中找到第一个大于 8 的数。
迭代实现:
1 | int firstGreaterThan(const vector<int> &nums, int target, int low, int high){ |
测试
1 | int main() { |