同向双指针滑动窗口算法:最大连续 1 的个数 III、将 x 减到 0 的最小操作数
滑动窗口算法用于解决最大连续 1 的个数 III 与将 x 减到 0 的最小操作数两道题目。前者通过维护窗口内 0 的数量不超过 k 来寻找最长连续区间;后者将问题转化为求和为总和减去 x 的最长连续子数组。两种解法均使用双指针技巧,时间复杂度 O(n),空间复杂度 O(1)。

滑动窗口算法用于解决最大连续 1 的个数 III 与将 x 减到 0 的最小操作数两道题目。前者通过维护窗口内 0 的数量不超过 k 来寻找最长连续区间;后者将问题转化为求和为总和减去 x 的最长连续子数组。两种解法均使用双指针技巧,时间复杂度 O(n),空间复杂度 O(1)。

力扣链接:1004. 最大连续 1 的个数 III
不要去想怎么翻转,不要把问题想的很复杂,这道题的结果无非就是一段连续的 1 中间塞了 k 个 0。 因此,我们可以把问题转化成:求数组中一段最长的连续区间,要求这段区间内的 0 个数不超过 k 个。 既然是连续区间,可以考虑使用「滑动窗口」来解决问题。
1)如果超标,依次让左侧元素滑出窗口,顺便更新哈希表的值,直到 0 的个数恢复正常; (3)程序到这里,说明窗口内元素是符合要求的,更新结果; (4)right++,处理下一个元素;
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int ret = 0;
for (int left = 0, right = 0, zero = 0; right < nums.size(); right++) {
// 进窗口
if (nums[right] == 0) zero++;
// 判断
while (zero > k)
if (nums[left++] == 0) zero--;
// 出窗口
// 更新结果
ret = max(ret, right - left + 1);
}
return ret;
}
};
时间复杂度:O(n),空间复杂度:O(1)。
本题整个的思路、算法原理、解题过程建议在纸上推导一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!
题目要求的是数组「左端 + 右端」两段连续的、和为 x 的最短数组,信息量稍微多一些,不易理清思路;我们可以转化成求数组内一段连续的、和为 sum(nums) - x 的最长数组。此时,就是熟悉的「滑动窗口」问题了。
(1)如果 sum<target,右移右指针,直至变量和大于等于 target,或右指针已经移到头; (2)如果 sum>target,右移左指针,直至变量和小于等于 target,或左指针已经移到头; (3)如果经过前两步的左右移动使得 sum == target,维护满足条件数组的最大长度,并让下个元素进入窗口。
class Solution {
public:
int minOperations(vector<int>& nums, int x) {
int sum = 0;
for (int a : nums) sum += a;
int target = sum - x;
//细节问题
if (target < 0) return -1;
int ret = -1;
for (int left = 0, right = 0, tmp = 0; right < nums.size(); right++)//tmp:和 sum 区分
{
tmp += nums[right];//进窗口
//判断
while (tmp > target) tmp -= nums[left++];//出窗口
if (tmp == target)//更新结果
ret = max(ret, right - left + 1);
}
if (ret == -1) return ret;
else return nums.size() - ret;
}
};
时间复杂度:O(n),空间复杂度:O(1)。
本题整个的思路、算法原理、解题过程建议在纸上推导一遍,大家可以参考一下手记的推导过程!最好做题的过程中自己也推导一遍!!!自己推导很重要!

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online