题目描述:
给定一个由若干0和1组成的数组A,我们最多可以将K个值从0变成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。
题解:
利用滑动窗口来实现:
设置左指针和右指针,统计右指针和左指针区间内0的个数;
如果小于等于K则向前移动右指针;
如果超过K,则向前移动左指针至到满足小于等于K;
统计可取最大的左右指针范围就是最长的子数组长度。
实现:
class Solution:
def longestOnes(self, A: List[int], K: int) -> int:
left_index=0
right_index=0
max_list_len=0
for right_index in range(len(A)):
while right_index-left_index+1-sum(A[left_index:right_index+1])>K:
left_index=left_index+1
max_list_len=max(right_index-left_index+1,max_list_len)
return max_list_len
以上代码测试时因为超时未通过,后将统计左右指针区间0的个数由每次重复计算SUM改为累加计算 :
class Solution:
def longestOnes(self, A: List[int], K: int) -> int:
left_index=0
right_index=0
max_list_len=0
right_zero_num=0
left_zero_num=0
for right_index in range(len(A)):
right_zero_num=right_zero_num+1-A[right_index]
while right_zero_num-left_zero_num>K:
left_zero_num=left_zero_num+1-A[left_index]
left_index=left_index+1
max_list_len=max(right_index-left_index+1,max_list_len)
return max_list_len
使用滑动窗口策略解决LeetCode的1004题,通过调整K个0为1,找到最长连续1子数组的长度。当右指针区间内的0不超过K时移动右指针,超过时移动左指针,优化算法避免重复计算,提高效率。
1083

被折叠的 条评论
为什么被折叠?



