1004:最大连续1的个数 III

1004:最大连续1的个数 III

1004:最大连续1的个数 III

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 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

思路

思路:滑动窗口
朋友面试时遇到这道题,对于练习滑动窗口题目,很有参考价值
题目要求最多可以把 K 个 0 变成 1,求仅包含 1 的最长连续子数组的长度
相当于在数组中找连续子数组,子数组当然越长越好,但有个条件【子数组中最多有K个0】
如果滑动窗口(连续子数组)的0个数超过K,则移动滑动窗口左边界
右边界持续移动,直至达到数组尾部

代码如下

// 时间复杂度O(N)
// 空间复杂度O(1)
public static void main(String args[]) {
    int[] nums = new int[]{1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0};
    longestOnes(nums, 2);
}

public static int longestOnes(int[] nums, int k) {
    if (nums == null || nums.length == 0)
        return 0;
    int slidingWindowLeft = 0;// 滑动窗口左边界
    int slidingWindowRight = 0;// 滑动窗口右边界

    int zeroNum = 0;// 滑动窗口中0的个数
    int length = 0;// 滑动窗口的长度
    for (slidingWindowRight = 0; slidingWindowRight < nums.length; slidingWindowRight++) {

        if (nums[slidingWindowRight] == 0) {
            zeroNum++;
        }

        if (zeroNum > k) {// 滑动窗口区间内0的个数大于K
            while (zeroNum > k) {
                if (nums[slidingWindowLeft] == 0) {
                    zeroNum--;
                }
                slidingWindowLeft++;

            }
        }

        if (slidingWindowRight - slidingWindowLeft + 1 > length)
            length = slidingWindowRight - slidingWindowLeft + 1;
    }
    return length;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值