LeetCode-1004. 最大连续1的个数 III

news2025/2/26 21:09:43

每日一题系列(day 20)

前言

🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈

🔎🔎如果说代码有灵魂,那么它的灵魂一定是👉👉算法👈👈,因此,想要写出💚优美的程序💚,核心算法是必不可少的,少年,你渴望力量吗😆😆,想掌握程序的灵魂吗❓❗️那么就必须踏上这样一条漫长的道路🏇🏇,我们要做的,就是斩妖除魔💥💥,打怪升级!💪💪当然切记不可😈走火入魔😈,每日打怪,拾取经验,终能成圣🙏🙏!开启我们今天的斩妖之旅吧!✈️✈️


题目:

给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k 个 0 ,则返回 数组中连续 1 的最大个数 。

示例1:

在这里插入图片描述
示例2:

在这里插入图片描述
提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1
  • 0 <= k <= nums.length

解法一(暴力枚举):


  首先分析题目,给定k个数,可以将数组里的0翻转为最多k个1,并且要求返回翻转后最长1的子数组。如果我们直观上来看的话,翻转0为最长子数组的情况可能不止一种,但是我们子数组最长的长度却是不变的。
  所以当翻转0的位置不同时,但是却造成了最长子数组长度相同,我们就不用管0翻转的顺序了。

  但是我们如何找出这个最长子数组呢?既然是数组,我们不妨可以枚举出所有情况,最后在返回最长子数组。
  既然要确定子数组的长度,那么就一定要有两个指针在数组上遍历,由于0的个数有限制,所以我们可以考虑使用计数器来统计0的个数,而被统计的0就相当于翻转成为了1。
  当0的个数超出限制后,我们本次遍历结束,在全局范围内设置一个ret变量接收本次遍历的最长子数组。左指针向后移动一位,右指针重置,开启第二轮遍历,直到遍历完。

  这里也可以优化一下,如果数组当中0的个数小于等于k,那么就相当于整个数组皆可以翻转,直接返回整个数组的长度即可。

代码演示:

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int sum_one = 0;//统计最长的1的子数组长度
        int sum_zero = 0;//统计0的个数

        for(int i = 0; i < nums.size() ; ++i) if(nums[i] == 0) sum_zero++;//0的个数

        if(sum_zero <= k) return nums.size();//k多0少的情况

        for(int i = 0 ; i < nums.size() ; ++i)//正常情况,i相当于左指针
        {
            int cnt = k;//将k赋值为cnt,当cnt >= 0 时为合法范围
            for(int j = i ; j < nums.size() ; ++j)//右指针移动
            {
                if(nums[j] == 0)//当数组元素为0时,翻转
                {
                    cnt--;
                }
                if(cnt >= 0)//符合条件每次都计算长度
                {
                    sum_one = max(j - i + 1, sum_one);//下标从0开始的,所以要加一
                }
            }
        }
        return sum_one;
    }
};

在这里插入图片描述
  但是这种暴力解法在本题时跑不过的,时间限制原因,所以我们只有另想他法,尽量去优化时间复杂度。


解法二(滑动窗口):

  虽然暴力枚举不能通过测试用例,但是也给我们提供了良好的思路,用双指针来解决问题,我们来分析上面的暴力解法有什么不妥?

  首先,我们其实没有必要全枚举,如果当右指针遇到0的时候,如果我们回退到i + 1的位置,那么从i + 1到上一次遍历的最远位置不就重新遍历了一遍?这种多余的遍历我们并不需要。
  所以当右指针遇到0的个数满了的时候,我们将左指针进行右移。
  加上了这一步,我们就可以将时间复杂度从O(n^2)降为O(n)了。最后需要注意的是,如果当左指针走过0的时候,我们最长子数组里面就少了个0,这个时候我们的计数器就该减去1了,每次循环我们都进行判断最长子数组。最后返回即可。

代码演示:

class Solution {
public:
    int longestOnes(vector<int>& nums, int k) {
        int ret = 0;
        int sum_zero = 0;
        for(int left = 0, right = 0; right < nums.size() ; ++right)
        {
            if(nums[right] == 0) sum_zero++;//统计翻转0个数
            while(sum_zero > k)//个数超了后移动左指针
            {
                if(nums[left++] == 0) sum_zero--;//越过0,子数组中的0就减少了,所以计数器也要自减
            }
            ret = max(ret, right - left + 1);//返回最终结果
        }
        return ret;
    }
};

在这里插入图片描述


总结:

  这题是一个很经典的滑动窗口的问题,结合我们之前做的滑动窗口的问题来看,滑动窗口出现的场景通常需要枚举数组所有情况,也就是暴力,然后我们在暴力的基础上进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504774.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenCV】如何在Linux操作系统下正确安装 OpenCV

前言 我是在虚拟机上跑的 Linux 5.8.0-44-generic。 配置如下&#xff1a; 目录 第一步&#xff1a;下载依赖文件 第二步&#xff1a;下载 opencv 和 opencv_contrib 源码 第三步&#xff1a;解压缩包 第四步&#xff1a;移动文件 第五步&#xff1a;生成 makefile 文件 …

oracle基础-多表关联查询 备份

一、概述 在实际应用系统开发中会设计多个数据表&#xff0c;每个表的信息不是独立存在的&#xff0c;而是若干个表之间的信息存在一定的关系&#xff0c;当用户查询某一个表的信息时&#xff0c;很可能需要查询关联数据表的信息&#xff0c;这就是多表关联查询。SELECT语句自身…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候&#xff0c;在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

【解读】OWASP 大语言模型(LLM)安全测评基准V1.0

大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;是指参数量巨大、能够处理海量数据的模型, 此类模型通常具有大规模的参数&#xff0c;使得它们能够处理更复杂的问题&#xff0c;并学习更广泛的知识。自2022 年以来&#xff0c;LLM技术在得到了广泛的应…

网络触手获取天气数据存入mysql 项目

首先这个案例不一定能直接拿来用&#xff0c;虽然我觉得可以但是里面肯定有一些我没考虑到的地方。 有问题评论或者私信我&#xff1a; 这个案例适合我这种学生小白 获取天气数据网址&#xff1a; https://lishi.tianqi.com/xianyang/202201.html 网络触手获取天气数据代码直…

这是一段神奇的提示词,能直接调取Claude 3的系统提示词!附详细解读

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

第一代高通S7和S7 Pro音频平台:超旗舰性能,全面革新音频体验

以下文章来源于高通中国 如今&#xff0c;音频内容与形式日渐丰富&#xff0c;可满足人们放松心情、提升自我、获取资讯等需求。得益于手机、手表、耳机、车载音箱等智能设备的广泛应用&#xff0c;音频内容可以更快速触达用户。从《音频产品使用现状调研报告2023》中发现&…

蓝桥杯大赛软件python赛道真题:蛇形填数

真题链接&#xff1a;https://www.lanqiao.cn/problems/594/learning/ 题目描述&#xff1a; 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如下图所示&#xff0c;小明用从1开始的正整数“蛇形”填充无限大的矩阵。 1 2 6 …

15:00面试,15:07就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

leetcode 热题 100_相交链表

题解一&#xff1a; 哈希表&#xff1a;两链表出现的第一个相同的值就是相交节点&#xff0c;因此我们先用哈希记录链表A所有出现过的值&#xff0c;再遍历链表B查找哈希表&#xff0c;找出第一个相同的值即为结果。 import java.util.HashSet;public class Solution {public …

实验二 Hello, miniEuler操作演示(保姆级教程)

PS&#xff1a;所有的批注都写在了块引用中&#xff0c;其他文字均为题干 print函数是学习几乎任何一种软件开发语言时最先学习使用的函数&#xff0c;同时该函数也是最基本和原始的程序调试手段&#xff0c;但该函数的实现却并不简单。本实验的目的在于理解操作系统与硬件的接…

DeepLearning in Pytorch|共享单车预测NN详解(思路+代码剖析)

目录 概要 一、代码概览 二、详解 基本逻辑 1.数据准备 2.设计神经网络 初版 改进版 测试 总结 概要 原文链接&#xff1a;DeepLearning in Pytorch|我的第一个NN-共享单车预测 我的第一个深度学习神经网络模型---利用Pytorch设计人工神经网络对某地区租赁单车的使用…

Diddler抓包工具——学习笔记

F12抓包 302【重定向】&#xff1a;当你发送了一个请求之后&#xff0c;那么这个请求重定向到了另外的资源 跳转和重定向的区别&#xff1a; 跳转是会把数据传到新的地址 重定向不会把新的数据传到新的地址 使用F12抓包时一定要打开Preserve Log开关&#xff0c;作用是保留…

【libwebrtc】基于m114

libwebrtc A C++ wrapper for binary release, mainly used for flutter-webrtc desktop (windows, linux, embedded).是 基于m114版本的webrtc 最新(20240309 ) 的是m122了。官方给出的构建过程 .gclient 文件 solutions = [{"name" : src,"url

表单进阶(3)-上传文件和隐藏字段

上传文件&#xff1a;<input type"file"> 隐藏字段&#xff1a;<input type"hidden" name"" id"" value"带给后端的信息"> 禁用disabled&#xff1a;<button disabled"disabled">注册</bu…

C++——string模拟实现

前言&#xff1a;上篇文章我们对string类及其常用的接口方法的使用进行了分享&#xff0c;这篇文章将着重进行对这些常用的接口方法的内部细节进行分享和模拟实现。 目录 一.基础框架 二.遍历字符串 1.[]运算符重载 2.迭代器 3.范围for 三.常用方法 1.增加 2.删除 3.调…

Linux系统——JVM调优

目录 一、GC如何调优 1.JVM调优的时机 2.JVM调优目标 3.JVM调优步骤 4.选择合适的垃圾回收器 5.调整内存大小 6.设置符合预期的停顿时间 7.调整内存区域大小比率 8.调整对象升老年代的年龄 9.调整大对象的标准 10.调整GC的触发时机 11.调整 JVM本地内存大小 二、JV…

推荐算法中经典排序算法GBDT+LR

文章目录 逻辑回归模型逻辑回归对于特征处理的优势逻辑回归处理特征的步骤 GBDT算法GBDTLR算法GBDT LR简单代码实现 逻辑回归模型 逻辑回归&#xff08;LR,Logistic Regression&#xff09;是一种传统机器学习分类模型&#xff0c;也是一种比较重要的非线性回归模型&#xff0…

指针篇章-(冒泡排序详解)

冒泡排序 图解 tmp图解 内容图解 每次循环的次数减少 for循环详解 冒泡排序是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c; 一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。 遍历数列的工作是重复地进行直到没有再需要交换&…

读算法的陷阱:超级平台、算法垄断与场景欺骗笔记05_共谋(中)

1. 默许共谋 1.1. 又称寡头价格协调&#xff08;Oligopolistic Price Coordination&#xff09;或有意识的平行行为&#xff08;Conscious Parallelism&#xff09; 1.1.1. 在条件允许的情况下&#xff0c;它会发生在市场集中度较高的行业当中 1.1.…