一、 二分查找
1. 基础模板
function binarySearch (arr, target) {
let l = 0;
let r = arr.length - 1;
while (l <= r) {
const mid = (l + r) >> 1;
if (arr[mid] === target) return mid;
if (arr[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
};
题目
2. lower_bound模板(最小的符合条件的值)
寻找第一个大于等于target的数
function findMin (nums) {
const target = ???;
let l = 0;
// 当结果为r的时候说明没有符合条件的
let r = nums.length;
while (l < r) {
const mid = (l + r) >> 1;
if (nums[mid] <= target) {
r = mid;
} else {
l = mid + 1;
}
}
return r;
};
题目
- 153. 寻找旋转排序数组中的最小值 ---> 题解
- 154. 寻找旋转排序数组中的最小值 II ---> 题解
3. upper_bound模板(最大的符合条件的值)
function findMax (nums) {
const target = ???;
// 结果 -1 则说明没有符合的答案
let l = -1;
let r = nums.length;
while (l < r) {
const mid = (l + r + 1) >> 1;
if (nums[mid] <= target) {
l = mid
} else {
r = mid - 1;
}
}
return l;
};
题解
- 69. x 的平方根 ---> 题解
- 34. 在排序数组中查找元素的第一个和最后一个位置 ---> 题解
- 74. 搜索二维矩阵 ---> 题解
二、三分查找
简述
三分法可用于求单峰函数的极大值或单谷函数的极小值,也适用多峰函数的局部极大/极小值
lmid:左侧mid rmid: 右侧mid
如果 lmid < rmid 则最大值一定不在 lmid左侧 则可舍去左半部分。同理,如果lmid < rmid 则最大值一定不在 rmid 右侧,则可舍去右半部分
题目
三、 二分答案
简述
对mid值进行判断,舍弃一边
题目
- 374. 猜数字大小 ---> 题解
- 410. 分割数组的最大值 ---> 题解
- 1482. 制作 m 束花所需的最少天数 ---> 题解