LeetCode 1004. 最大连续1的个数 III【不定长滑窗】1656
Given an array A of 0s and 1s, we may change up to K values from 0 to 1.Return the length of the longest (contiguous) subarray that contains only 1s. Example 1:Input: A = [1,1,1,0,0,0,1
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。
为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。
由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。
给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。
示例 1:
输入:nums = [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:
输入:nums = [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 <= nums.length <= 10^5nums[i]不是0就是10 <= k <= nums.length
解法 不定长滑窗(求最长但越短越容易合法)
统计窗口内 0 0 0 的个数 c n t 0 cnt_0 cnt0 ,则问题转换为 c n t 0 ≤ k cnt_0 \le k cnt0≤k 的前提下,窗口大小的最大值。这可用滑动窗口实现。
class Solution {
public int longestOnes(int[] nums, int k) {
int ans = 0;
int cnt0 = 0;
int left = 0;
for (int right = 0; right < nums.length; right++) {
cnt0 += 1 - nums[right]; // 0 变成 1,用来统计 cnt0
while (cnt0 > k) {
cnt0 -= 1 - nums[left];
left++;
}
ans = Math.max(ans, right - left + 1);
}
return ans;
}
}
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
int ans = 0, left = 0, cnt0 = 0;
for (int right = 0; right < nums.size(); right++) {
cnt0 += 1 - nums[right]; // 0 变成 1,用来统计 cnt0
while (cnt0 > k) {
cnt0 -= 1 - nums[left];
left++;
}
ans = max(ans, right - left + 1);
}
return ans;
}
};
class Solution:
def longestOnes(self, nums: List[int], k: int) -> int:
ans = left = cnt0 = 0
for right, x in enumerate(nums):
cnt0 += 1 - x # 0 变成 1,用来统计 cnt0
while cnt0 > k:
cnt0 -= 1 - nums[left]
left += 1
ans = max(ans, right - left + 1)
return ans
func longestOnes(nums []int, k int) (ans int) {
left, cnt0 := 0, 0
for right, x := range nums {
cnt0 += 1 - x // 0 变成 1,用来统计 cnt0
for cnt0 > k {
cnt0 -= 1 - nums[left]
left++
}
ans = max(ans, right-left+1)
}
return
}
复杂度分析:
- 时间复杂度: O ( n ) O(n) O(n) ,其中 n n n 为 n u m s nums nums 的长度。证明方式见视频讲解。
- 空间复杂度: O ( 1 ) O(1) O(1) 。
更多推荐


所有评论(0)