跳到主要内容

分享丨【题单】滑动窗口(定长/不定长/多指针)

Tip

题单已老, 请点击链接, 查看最新版!

By 灵茶山艾府

右边数字为难度分。

定长滑动窗口

不定长滑动窗口(求最长/最大)

不定长滑动窗口(求最短/最小)

不定长滑动窗口(求子数组个数)

多指针滑动窗口

计算可排除前后也可作为子数组的, 问子数组数目, 模版:

0, 1 数组, 问和为goal的子数组数目. 因为可能存在前后缀 [0,0,0,1,0,0], 0 可以使得窗口移动, 因此我们使用两个指针l1, l2作为前面, (l1)一个负责goal窗口, (l2)一个负责goal - 1窗口, 那么就可以得到排除的0的部分, 最后res += l2 - l1即可.

class Solution { // 930. 和相同的二元子数组 code
public:
int numSubarraysWithSum(vector<int>& nums, int goal) {
int n = nums.size(), res = 0;
for (int i = 0, l1 = 0, l2 = 0, sum1 = 0, sum2 = 0; i < n; ++i) {
sum1 += nums[i];
while (l1 <= i && sum1 > goal)
sum1 -= nums[l1++];

sum2 += nums[i];
while (l2 <= i && sum2 >= goal)
sum2 -= nums[l2++];

res += l2 - l1;
}
return res;
}
};
C++
请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...