这篇文章主要介绍了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