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. 考试的最大困扰度

javaleetcode1004. 最大连续1的个数 III;2024. 考试的最大困扰度

1004.最大连续1的个数III

leetcode 最大连续1的个数 III

1004. 最大连续1的个数 III

LeetCode #485 最大连续 1 的个数