leetcode如何实现滑动窗口

这篇文章主要介绍了leetcode如何实现滑动窗口,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

滑动窗口类题目基本上技巧在于维护一个滑动窗口,移动窗口的左右指针,使得窗口满足一定条件,关键在于如何处理窗口满足条件的地方,使得算法更高效。

最大连续1的个数

给定一个由若干 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。

解题思路:

1,本题的要点不在滑动窗口长度,在于,维持窗口内0的个数<=K

2,我们定义指针l,r分别表示窗口左右下标,移动r,当A[r]==0的时候我们增加0的个数记录sum,分两种情况

A,sum>K    这个时候需要移动左指针,让0的个数减1

B,sum<=K  无需处理,继续移动右指针

func longestOnes(A []int, K int) int {    if K==0 &&len(A)<1{        return 0    }    l:=0    sum:=0    max:=0    for r:=0;r<len(A);r++{        if A[r]==0{            sum++            if sum>K{                for A[l]!=0{                    l++                }                l++                sum--            }        }          if r-l+1>max{            max=r-l+1        }    }     return max}

感谢你能够认真阅读完这篇文章,希望小编分享的“leetcode如何实现滑动窗口”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

原创文章,作者:kirin,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/224040.html

(0)
上一篇 2022年1月7日 05:03
下一篇 2022年1月7日 05:03

相关推荐

发表回复

登录后才能评论