yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

最大连续1的个数 III #112

Open yankewei opened 3 years ago

yankewei commented 3 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。

提示:

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-consecutive-ones-iii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

yankewei commented 3 years ago

滑动窗口

维护一个窗口即可, 要考虑左指针变化的时候,如果原来的值为0,记得K++

func longestOnes(A []int, K int) int {
    var ret int
    l,r := 0,0
    for r < len(A) {
        if A[r] == 1 {
            ret = max(ret, r-l+1)
            r++
            continue
        }
        if A[r] == 0 {
            if K > 0 {
                ret = max(ret, r-l+1)
                r++
                K--
            } else {
                if A[l] == 0 {
                    K++
                }
                l++
            }
        }
    }
    return ret
}

func max(x, y int) int {
    if x > y {
        return x
    }
    return y
}