1004. 最大连续1的个数 III Max Consecutive Ones III
滑动窗口
这个问题跟之前的胡杨林补种一样, 用滑动窗口来解决:
- 窗口右侧经过0时, 计数加1
- 当窗口区间内的0的个数大于k 时, 把窗口左侧向右移, 直到窗口范围内的0的个数不大于k
- 然后更新最大的连续为1的个数
#![allow(unused)] fn main() { // 滑动窗口 pub fn longest_ones1(nums: Vec<i32>, k: i32) -> i32 { // 窗口右侧经过的0 的个数, 减去窗口左侧经过的0的个数, 就是需要翻转为1的个数 let mut left = 0; let mut right = 0; let mut num_zero = 0; let k = k as usize; let mut longest_ones = 0; while right < nums.len() { // 需要翻转 if nums[right] == 0 { num_zero += 1; } // 保证最大翻转次数不大于 k while num_zero > k { // 窗口左侧右移 if nums[left] == 0 { num_zero -= 1; } left += 1; } // 注意边界情况. longest_ones = longest_ones.max(right - left + 1); // 窗口右侧向右移 right += 1; } longest_ones as i32 } }