免费网站模板源码下载/网站制作优化排名
1.题目详情
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度
2.解题思路
这道题是窗口滑动类型题,很容易想到利用双指针。定义两个指针left和right,right不断向后遍历,增加窗口长度,遍历过程中,若遇到0,将其翻转为1并计数为count。若count大于所给的K值,那么left后移并接着遍历,需保持窗口不变
这题就是求最大的窗口。所以窗口变小是没有意义的。
1)窗口增大:left不变,right右移,即right += 1
什么时候增大?窗口内的0,数量没有达到上限K。
2)窗口不变:left跟着right右移
什么时候不变?窗口内的0,数量达到了上限K。
3.代码实现
class Solution:def longestOnes(self, A: List[int], K: int) -> int:#窗口滑动问题,两个指针都从0开始left,right,count = 0,0,0 #初始化左右指针,将0翻转为1的个数#左指针先不动,右指针向右滑动for right in range(0,len(A)):if A[right] == 0:count += 1 #将0翻转为1的个数+1if count > K: #将0变1的个数大于规定的K个值if A[left] == 0: #并且左指针指向的数字为0,那么将0翻转为1的个数减1,因为不能超过规定k值count -= 1left += 1 #左指针后移一位return right-left+1
4.知识点
理解窗口滑动思想