lively-krishnan / brus_question_warehouse

Keep learning
1 stars 1 forks source link

1004:最大连续1的个数 III #7

Open lively-krishnan opened 2 years ago

lively-krishnan commented 2 years ago
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。

返回仅包含 1 的最长(连续)子数组的长度。

示例 1:

输入:A = [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:

输入:A = [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。
lively-krishnan commented 2 years ago

题解: 快指针如果等于0 则,K值--, K值小于0的时候开始慢支针移动,慢支针等于0 的时候 K值++, 然后取最大值

根据题意: 我们最多可以将 K 个值从 0 变成 1 所以: 如果快指针 right 如果等于0 则,K值-- 也就是说我目前有 n 个K值 可以悔棋

K值小于0的时候开始慢支针移动, 这个时候快指针停止了,没有棋子可以悔了,我们开始用慢指针 left 在继续查找

然后 取 窗口指针(快指针 和慢指针的区间 就是窗口)的 最大值


var longestOnes = function(nums, k) {
    let right = 0, left = 0, result = 0

    while(right < nums.length) {
        if(nums[right] === 0) {
            k--
        }

        while(k < 0) {
            if (nums[left] === 0) {
                k++
            }
            left++
        }
        result = Math.max(result, right - left + 1)
        right++
    }
    return result
};