力扣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。

我们可以把这个题转换成: 求最长子数组, 要求这段区间内0的个数不超过k个.

既然是连续区间, 那么就可以考虑使用滑动窗口.

算法流程

  1. 初始化left = 0, right= 0

  2. 进窗口.

    • 如果进入的元素是0, count++
  3. 判断:

    只要count > k, 那么就出窗口.

    如果出去的元素时0, count--.

  4. 更新结果

代码

class Solution {
    public int longestOnes(int[] nums, int k) {
        int ans = 0;
        int count = 0;
        for(int right = 0, left = 0; right < nums.length; right++) {
            if(nums[right] == 0) {
                count++;
            }
            while(count > k) {
                if(nums[left] == 0) {
                    count--;
                }
                left++;
            }
            ans = Math.max(ans, right - left + 1);
        }
        return ans;
    }
}

你可能感兴趣的:(力扣算法题,leetcode,算法)