LeetCode 1004. 最大连续1的个数 III
Posted 数据结构和算法
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1004. 最大连续1的个数 III相关的知识,希望对你有一定的参考价值。
截止到目前我已经写了 500多道算法题,其中部分已经整理成了pdf文档,目前总共有1000多页(并且还会不断的增加),大家可以免费下载
下载链接:https://pan.baidu.com/s/1hjwK0ZeRxYGB8lIkbKuQgQ
提取码:6666
来看下代码
public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int maxWindow = 0;//窗口的最大值
int zeroCount = 0;//窗口中0的个数
for (int right = 0; right < A.length; right++) {
if (A[right] == 0) {
zeroCount++;
}
//如果窗口中0的个数超过了K,要缩小窗口的大小,直到0的个数
//不大于K位置
while (zeroCount > K) {
if (A[left++] == 0)
zeroCount--;
}
//记录最大的窗口
maxWindow = Math.max(maxWindow, right - left + 1);
}
return maxWindow;
}
public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int right = 0;//窗口右边的位置
int zeroCount = 0;//窗口中0的个数
for (; right < A.length; right++) {
if (A[right] == 0) {
zeroCount++;
}
//如果窗口中0的个数超过了K,要缩小窗口的大小
if (zeroCount > K && A[left++] == 0)
zeroCount--;
}
return right - left;
}
或者还可以更简洁一些,其实原理都一样,换汤不换药。
public int longestOnes(int[] A, int K) {
int left = 0;//窗口左边的位置
int right = 0;//窗口右边的位置
int zeroCount = 0;//窗口中0的个数
for (; right < A.length; right++) {
zeroCount += 1 - A[right];
if (zeroCount > K)
zeroCount -= 1 - A[left++];
}
return right - left;
}
总结
滑动窗口和回溯算法其实都有一个经典的模板,对于回溯算法可以看下《450,什么叫回溯算法,一看就会,一写就废》。而滑动窗口问题,首先要使用两个指针,一个确定窗口的左边界,一个确定窗口的右边界,其中左边界不动,右边界往右移动,每移动一步都要判断窗口内的值是否满足条件,如果满足,要记录下最优值。如果不满足,左边界在开始移动,相当于缩小窗口……。滑动窗口的题有很多,有时间再对滑动窗口做个总结。
以上是关于LeetCode 1004. 最大连续1的个数 III的主要内容,如果未能解决你的问题,请参考以下文章
javaleetcode1004. 最大连续1的个数 III;2024. 考试的最大困扰度