本文共 833 字,大约阅读时间需要 2 分钟。
给定一个由若干 0 和 1 组成的数组 A,我们最多可以将 K 个值从 0 变成 1 。
返回仅包含 1 的最长(连续)子数组的长度
这道题是窗口滑动类型题,很容易想到利用双指针。定义两个指针left和right,right不断向后遍历,增加窗口长度,遍历过程中,若遇到0,将其翻转为1并计数为count。若count大于所给的K值,那么left后移并接着遍历,需保持窗口不变
这题就是求最大的窗口。所以窗口变小是没有意义的。
1)窗口增大:left不变,right右移,即right += 1
什么时候增大?窗口内的0,数量没有达到上限K。
2)窗口不变:left跟着right右移
什么时候不变?窗口内的0,数量达到了上限K。
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的个数+1 if count > K: #将0变1的个数大于规定的K个值 if A[left] == 0: #并且左指针指向的数字为0,那么将0翻转为1的个数减1,因为不能超过规定k值 count -= 1 left += 1 #左指针后移一位 return right-left+1
理解窗口滑动思想
转载地址:http://hbagz.baihongyu.com/