单调队列里存下标还是值

第 1 步:上:数组;下:单调队列里的值 第 2 步:4 入队:队尾更大的先弹掉 第 3 步:2 入队:队尾更大的先弹掉 第 4 步:队首就是这个窗口的最小 第 5 步:队首就是这个窗口的最小 第 6 步:队首就是这个窗口的最小 第 7 步

开始练习 →

为什么要用双端队列

单调队列需要【0】,所以用双端队列。 本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。

开始练习 →

三个窗口的最小值

运行下面这段程序: 本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。 #include <algorithm> #include <de

开始练习 →

补全:最小的队尾维护

补全 window_min:求最小,要弹掉队尾不比 a[i] 小的。补全后输出每个窗口的最小值。 本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。 (本题

开始练习 →

补全:最小的队首过期

补全 window_min:队首下标 <= i - k 就出队。补全后输出每个窗口的最小值。 本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。 (本

开始练习 →

补全:最小的出结果时机

补全 window_min:凑满 k 个数就产生结果。补全后输出每个窗口的最小值。 本节模型:window_max / window_min 用 std::deque 存下标做单调队列,求每个长度为 k 的窗口的最值。 (本题用 g++ -

开始练习 →

每个窗口的最大减最小

补全 main:对 {4, 2, 6, 1, 5, 3} 的每个长度为 3 的窗口,算「最大值 − 最小值」,输出其中最大的那个。window_max、window_min 都已经写好了。 本节模型:window_max / window_

开始练习 →

什么样的 DP 能这样优化

形如 dp[i] = max(dp[j]) + w、且 j 落在一个随 i 滑动的区间里的转移,可以用【0】优化。 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。d

开始练习 →

优化后的复杂度

第 1 步:下:跳到这格的最好成绩 第 2 步:起点就是它自己 第 3 步:前 2 格里挑最大的接过来 第 4 步:前 2 格里挑最大的接过来 第 5 步:前 2 格里挑最大的接过来 第 6 步:前 2 格里挑最大的接过来 第 7 步:前

开始练习 →

跳格子的最高分

运行下面这段程序: 本节模型:jump_best——从第 0 格出发,每次往右跳 1~k 格,得分是踩过的格子之和,求跳到最后一格的最高得分。dp[i] 要从前 k 格里 dp 最大的那一格转移过来,这个「区间最大」交给单调队列。 #inc

开始练习 →