贪心
贪心算法:是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
贪心算法在有最优子结构的问题中尤为有效。
在此阶段,八字箴言:大胆假设,小心求证。只需要假设正确的贪心策略,求正确性根据是否能够找到反例即可。
二分
常见题型:
-
在有序序列中,查询 k 数字是否存在(无相同的数字)
-
在有序序列中,查询第一个大于等于 k 数字是否存在(存在相同的数字)
1 5 5 5 9 10 查询第一个大于等于 5,在第 2 个数字 -
在有序序列中,查询第一个大于 k 数字是否存在(存在相同的数字)
1 5 5 5 9 10 查询第一个大于 5,在第 5 个数字
【二分模板】
以第一个大于等于 need 为例:
// 搜索区间 [L,R],只有当搜索区间不是正确的区间时,结束搜索
while (L <= R) {
int mid = (L + R) / 2; // 正中间的下标用左端下标 + 右端下标之和 / 2 得到
// 随后根据正中间的数值判断下一步向哪个区间进一步的查找
if (a[mid] < need) L = mid + 1; // 新的区间范围是 [mid + 1, R]
else res = mid, R = mid - 1; // 新的区间范围是 [L, mid - 1]
}
二分答案
二分答案与二分查找类似,即对有着单调性的答案进行二分,大多数情况下用于求解满足某种条件下的最大(小)值。答案和某一关系呈现单调性,如同二分时一样,可以根据中间值判断向左右两边查询。
二分答案模板:
通过 check 函数来校验,是否答案题目的需求
bool check() {
...
return ...
}
while (L <= R) {
int mid = (L + R) / 2;
if (check()) {
... // 如果满足题目,记录答案,并且区间修改
} else ... // 不满足题目,区间修改
}