一刷274-滑动窗口-1004. 最大连续1的个数 III(m)

题目:
给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,
则返回 数组中连续 1 的最大个数 。
------------------
示例 1:
输入:nums = [1,1,1,0,0,0,1,1,1,1,0], K = 2
输出:6
解释:[1,1,1,0,0,1,1,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 6。
示例 2:

输入:nums = [0,0,1,1,0,0,1,1,1,0,1,1,0,0,0,1,1,1,1], K = 3
输出:10
解释:[0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1]
粗体数字从 0 翻转到 1,最长的子数组长度为 10。
 
提示:
1 <= nums.length <= 105
nums[i] 不是 0 就是 1
0 <= k <= nums.length
--------------------
思路:
这题可以使用两个指针,一个指向窗口的 左边,一个指向窗口的 右边,
每次遍历数组的时候窗口右边的指针始终都会往右移动,然后顺便统计窗口内0的个数,
如果0的个数大于 K 的时候,我们在移动窗口左边的指针,
直到窗口内 0 的个数不大于 K 为止……,具体可以参照下图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

其实还可以换种思路,当窗口内0的个数刚好大于K的时候(也就是zeroCount+1==K),
说明这个时候right指向的肯定是0,
那么目前为止最大的窗口大小是(right-1)-left,因为窗口的右指针是一直往右滑动的,
我们可以通过改变左指针的位置来缩小窗口。

所以right - left始终指向的是最大窗口的值,最后我们只需要返回right - left即可,
不需要while循环,来看下代码
----------------------
class Solution {
    public int longestOnes(int[] nums, int k) {
        int left = 0;//滑动窗口左指针
        int right = 0;//滑动窗口右指针
        int zeroCount = 0;//窗口内零的个数, 用来和k比较
        for (; right < nums.length; right++) {//遍历
            if (nums[right] == 0) zeroCount++;
            if (zeroCount > k) {//当窗口内 0的个数大于 k时, 移动窗口
                if (nums[left] == 0) {//当左指针指向为 0时,zeroCount更新
                    zeroCount--;
                }
                left++;//否则只更新left
            }
        }
        return right - left;
    }
}

LC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值