最大连续1的个数 III
难度:
标签:
题目描述
代码结果
运行时间: 54 ms, 内存: 16.7 MB
/*
题目思路:
使用滑动窗口的方法来解决这个问题。虽然Java Stream API并不适合处理需要保持状态和
在多次迭代之间进行复杂状态维护的问题,但我们仍然可以使用基本的Java和少量的Stream API
来实现这个算法。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public int longestOnes(int[] nums, int k) {
int left = 0, right = 0;
int maxLength = 0;
int zerosCount = 0;
while (right < nums.length) {
if (nums[right] == 0) {
zerosCount++;
}
while (zerosCount > k) {
if (nums[left] == 0) {
zerosCount--;
}
left++;
}
maxLength = Math.max(maxLength, right - left + 1);
right++;
}
return maxLength;
}
}
解释
方法:
本题解使用滑动窗口的策略,通过遍历数组维护一个窗口,该窗口可以包含最多 k 个 0 和任意数量的 1。遍历数组 nums 时,如果遇到 0,则增加 zero 计数器。如果 zero 计数器超过 k,表示当前窗口不满足条件,此时需要调整窗口的左边界 j,直到窗口内的 0 的数量不超过 k 为止。最终,窗口的最大宽度即为数组中可以通过翻转最多 k 个 0 而形成的最长连续 1 的长度。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在滑动窗口策略中,如何确定何时需要移动窗口的左边界以保持窗口内最多包含k个0?
▷🦆
如果数组中所有元素都是0,且k小于数组长度,这种情况下算法的输出是什么?
▷🦆
在调整窗口左边界时,你是如何确保减少的zero计数器总是对应于窗口左端的0而非1?
▷🦆
为什么在计算最长连续1的长度时,使用了`len(nums) - j`这种计算方式?这是否考虑了窗口内可能的1的数量?
▷相关问题
替换后的最长重复字符
给你一个字符串 s
和一个整数 k
。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k
次。
在执行上述操作后,返回 包含相同字母的最长子字符串的长度。
示例 1:
输入:s = "ABAB", k = 2 输出:4 解释:用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:s = "AABABBA", k = 1 输出:4 解释: 将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。 子串 "BBBB" 有最长重复字母, 答案为 4。 可能存在其他的方法来得到同样的结果。
提示:
1 <= s.length <= 105
s
仅由大写英文字母组成0 <= k <= s.length