目录

  1. 概述
  2. 算法模版
  3. 附录

概述

二分算法,原本只是用来在一个有序区间中查找某个值时使用,但是在真实场景中,它不是只有这一个作用。从更全面的角度来说,二分法能做到以下几点:

  • 有序区间上查找某个值
  • 有序区间上查找最左侧或者最右侧的值
  • 无序区间的峰值

算法模版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]
while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=
int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2
if (nums[middle] > target) {
right = middle - 1; // target 在左区间,所以[left, middle - 1]
} else if (nums[middle] < target) {
left = middle + 1; // target 在右区间,所以[middle + 1, right]
} else { // nums[middle] == target
return middle; // 数组中找到目标值,直接返回下标
}
}
// 未找到目标值
return -1;
}
};

附录

我写了首诗,让你闭着眼睛也能写对二分搜索