LeetCode——最大连续1的个数 III(滑动窗口)

简介: LeetCode——最大连续1的个数 III(滑动窗口)

这是我参与8月更文挑战的第12天,活动详情查看:8月更文挑战

题目描述

image.png

解题思路

本题的核心思路是滑动窗口,而滑动窗口的实现需要借助双指针,这是解决本题的核心思路。

  1. 定义滑动窗口的左右边界。
let l = 0;
let r = 0;
复制代码
  1. 定义滑动窗口中连续1的个数(包含K个零)
let max = 0;
复制代码
  1. 定义滑动窗口中零的个数。
let zeros = 0;
复制代码
  1. 核心循环体
  • 进入循环的条件是右边界越界
while (r < nums.length)
复制代码
  • 判断滑动窗口中零的个数和K的关系

只有两种关系,要么滑动窗口中零的个数小于等于K,要么大于K,如果小于K,说明窗口右边界还未满足条件,还需要继续扩充右边界,此时让r++,但是在右边界扩充的时候,我们要看当前右指针指向的元素是0还是1,如果是1则直接向右扩充即可,但是如果是1,则需要更新0的个数之后,继续扩充,如果零的个数大于K,则需要移动左边界,在移动左边界的时候,依然要考虑上述因素。

if (zeros <= k) {
        if (nums[r] === 1) {
            r++;
        } else {
            r++;
            zeros++;
        }
    }
    if (zeros > k) {
        if (nums[l] === 0) {
            zeros--;
            l++;
        } else {
            l++;
        }
    }
复制代码
  • 更新最大值(因为r总是先移动后判断,所以用右边界-左边界就可以和最大值进行比较更新)
if (r - l > max) {
    max = r - l;
}
复制代码

AC代码

// 核心思路: 滑动窗口 + 更新最大值
var longestOnes = function (nums, k) {
    // 定义滑动窗口的左右边界
    let l = 0;
    let r = 0;
    // 定义滑动窗口中连续1(包含K个零)的最大值
    let max = 0;
    // 定义滑动窗口中0的个数
    let zeros = 0;
    // 进入循环的条件是:滑动窗口的右边界没有越界
    while (r < nums.length) {
        if (zeros <= k) {
            if (nums[r] === 1) {
                r++;
            } else {
                r++;
                zeros++;
            }
        }
        if (zeros > k) {
            if (nums[l] === 0) {
                zeros--;
                l++;
            } else {
                l++;
            }
        }
        if (r - l > max) {
            max = r - l;
        }
    }
    return max;
};
复制代码

执行结果


image.png

题目反思

  • 学会使用滑动窗口的方式求解子区间、子数组问题。
  • 学会使用更新的方式获取最大值。
相关文章
|
4天前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
4天前
|
Go
golang力扣leetcode 239.滑动窗口最大值
golang力扣leetcode 239.滑动窗口最大值
33 0
|
4天前
leetcode239滑动窗口的最大值刷题打卡
leetcode239滑动窗口的最大值刷题打卡
16 0
|
4天前
滑动窗口最大值(leetcode hot100)
滑动窗口最大值(leetcode hot100)
|
4天前
|
索引
LeetCode438题(无敌双指针——滑动窗口)
LeetCode438题(无敌双指针——滑动窗口)
|
4天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0
|
4天前
leetcode代码记录(滑动窗口最大值
leetcode代码记录(滑动窗口最大值
9 0
|
4天前
|
算法 测试技术
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
每日一题:LeetCode-209. 长度最小的子数组(滑动窗口)
|
7月前
|
算法 C++
【LeetCode 算法专题突破】滑动窗口(⭐)
【LeetCode 算法专题突破】滑动窗口(⭐)
26 0
|
4天前
|
存储
【Leetcode 209】长度最小的子数组 —— 滑动窗口|双指针
我们可以使用双指针解决本题,定义两个指针 i 和 j 分别表示子数组(滑动窗口窗口)的开始位置和结束位置,维护变量 sum 存储子数组中的元素和。每一轮迭代中,每当 sum >= target 则记录子数组最小长度,移动慢指针。在每一轮迭代最后,移动快指针