【滑动窗口】leetcode1004:最大连续1的个数

这篇具有很好参考价值的文章主要介绍了【滑动窗口】leetcode1004:最大连续1的个数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.题目描述

最大连续1的个数

【滑动窗口】leetcode1004:最大连续1的个数,算法,数据结构

 这道题要我们找最大连续1的个数,看到“连续”二字,我们要想到滑动窗口的方法。滑动窗口的研究对象是一个连续的区间,这个区间需要满足某个条件。那么本题要找的是怎样的区间呢?是一个通过翻转0后得到连续1的区间,而最多可以翻转k个字符。

故要找的是包含0的个数不超过k的区间,因为如果超过k个0,即使经过翻转,该区间的1也还是不连续。

题意转化过来后,本题便不再困难。

二.思路分析

滑动窗口是在暴力解法的基础上优化过来的。本题的暴力解法就是两层for循环枚举所有的区间,找出满足条件的区间,通过比较得到最长的区间长度,结果就是数组中连续1的最大个数。

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) 
    {
        int n = nums.size();
        int ret = 0;
        for (int left = 0; left < n; left++)
        {
            int zero = 0;//记录0的个数
            for (int right = left; right < n; right++)
            {
                if (nums[right] == 0)
                {
                    zero++;
                }
                //如果0的个数已经超过k,right向后枚举的区间肯定也不符合要求
                if (zero > k)
                {
                    break;
                }
                ret = max(ret, right - left + 1);
            }
        }

        return ret;
    }
};

要想用滑动窗口,首先要证明right没有回退的必要

【滑动窗口】leetcode1004:最大连续1的个数,算法,数据结构

 如图,right从left位置出发,依次向后枚举,到图中的位置[left, right]区间内0的个数大于k,停了下来。这说明[left, right - 1]区间是满足要求的。

 

【滑动窗口】leetcode1004:最大连续1的个数,算法,数据结构

按照暴力枚举策略,left向右移动一步,right回退到left位置。但最终right还是会回到原来的标记处。因为通过上一轮枚举,我们可知图中大括号标记的区间都是符合条件的,而right只有在区间不满足要求时才会停下。所以right没有必要回退,留在原地即可。 

【滑动窗口】leetcode1004:最大连续1的个数,算法,数据结构 

 那么此时[left, right]区间是否符合条件呢?答案是不一定。因为可能left跳过的是一个1, 0的数量并没有减少,也有可能跳过了一个0,区间内刚好有k个0。

当区间符合条件时,我们让right继续向后移动,接下来的步骤就和上面一样了。当区间不符合条件时,right向后枚举的区间就更不满足了,所以我们让left继续向右移动,直到区间满足要求为止。

故判断应该是一个循环语句,不能简单地只判断一次。

三.代码编写

【滑动窗口】leetcode1004:最大连续1的个数,算法,数据结构

按照滑动窗口的模版,找到各个条件即可。当枚举的情况满足要求时应该更新结果。什么时候满足要求呢?

1.进窗口之后,zero>=k,符合要求

2.进窗口之后,zero<k,经过若干次出窗口操作后,zero=k ,满足要求

故更新结果应放在整个循环的最后面

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int n =nums.size();
        int zero = 0;//记录窗口内0的个数
        int left = 0, right = 0;
        int ret = 0;
        while (right < n)
        {
            //进窗口
            if (nums[right] == 0)
            {
                zero++;
            }

            //判断
            while (zero > k)
            {
                //出窗口
                if (nums[left] == 0)
                {
                    zero--;
                }
                left++;
            }

            //更新结果
            ret = max(ret, right - left + 1);

            right++;
        }
        
        return ret;
    }
};

时间复杂度O(n),相比于暴力枚举的O(n^2)提升了不少。文章来源地址https://www.toymoban.com/news/detail-676832.html

到了这里,关于【滑动窗口】leetcode1004:最大连续1的个数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 滑动窗口(同向)同向双指针 leetcode713 3 1004 1234

    双指针从同一侧开始走 一般是right进行无脑遍历,left控制边界(导致模板化) 深刻理解题目概念以及**(right - left +1)** 的含义 多思考画图 具体还是要以题目为例 几个关键点 是正整数组 要找连续子数组(同向双指针) 完全模板化编程 几个关键点 子串即连续子数组(同向

    2023年04月18日
    浏览(24)
  • Leetcode:【485. 最大连续 1 的个数】

    题目 给定一个二进制数组  nums  , 计算其中最大连续  1  的个数。 难度: 简单 题目链接:485. 最大连续 1 的个数 示例1: 示例2: 代码展示 【解析】 在二进制数组中,元素只有 0 和 1 ,返回得是连续1最多得个数,此时回想到 用一个变量来记录每一次得连续1的个数(co

    2024年02月08日
    浏览(24)
  • leetcode485. 最大连续 1 的个数

    题目描述 解题思路 执行结果 leetcode 485. 最大连续 1 的个数 题目描述 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入:nums = [1,0,1,1,0,1] 输出

    2023年04月15日
    浏览(24)
  • 【Leetcode -485.最大连续1的个数 -492.构造矩形】

    题目:给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1, 1, 0, 1, 1, 1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入:nums = [1, 0, 1, 1, 0, 1] 输出:2 思路是遍历一次数组,如果是1就使用变量count累加

    2024年02月05日
    浏览(32)
  • ( 数组和矩阵) 485. 最大连续 1 的个数 ——【Leetcode每日一题】

    难度:简单 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums = [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入:nums = [1,0,1,1,0,1] 输出:2 提示: 1 = n u m s . l e n g t h = 1 0 5 1 = nums.length = 10^5

    2024年02月08日
    浏览(34)
  • 滑动窗口求连续数列最大值(固定窗长和非固定窗长)

    非固定窗长 思路: sum = 0,max = num[0], 依次遍历一个一个往前加,sum = sum + num[i], 如果sum[i] 小,则替换sum 如果·sum max, 则max = sum; 固定窗长 要求固定k长度数组的和 先求固定长度的和,然后sum里面加后面的,丢弃前面的

    2024年01月22日
    浏览(26)
  • LeetCode239.滑动窗口最大值

    看到这道题我就有印象, 我在剑指offer里面做过这道题,我记得当时用的是优先队列,然后我脑子里一下子就有了想法,拿优先队列作为窗口,每往右移动一步,把左边的数remove掉,把右边的数add进来,然后把队头,也就是窗口中最大的元素放入答案数组,然后就写出了如下

    2024年02月11日
    浏览(35)
  • leetcode-239-滑动窗口最大值

    题意描述: 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例: 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 输出:[3,3,5,5,6,7] 解释: 滑动

    2024年02月07日
    浏览(39)
  • 剑指 Offer 59 - I. 滑动窗口的最大值 / LeetCode 239. 滑动窗口最大值(优先队列 / 单调队列)

    链接:剑指 Offer 59 - I. 滑动窗口的最大值;LeetCode 239. 滑动窗口最大值 难度:困难 下一篇:剑指 Offer 59 - II. 队列的最大值(单调队列) 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗

    2024年02月15日
    浏览(30)
  • 【LeetCode热题100】【子串】滑动窗口最大值

    题目 给你一个整数数组  nums ,有一个大小为  k   的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的  k  个数字。滑动窗口每次只向右移动一位。 返回  滑动窗口中的最大值  。 示例 1: 示例 2: 提示: 1 = nums.length = 105 -104 = nums[i] = 104 1 =

    2024年01月19日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包