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

每日一题系列(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.mzph.cn/news/734197.shtml

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

相关文章

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题&#xff1a;上周电脑黑屏&#xff0c;只有鼠标&#xff0c;鼠标还不能右键&#xff01;&#xff01; 中招&#xff1a;win10系统最新版火绒安全 &#xff0c;那你有概率获得开机黑屏套餐一份。 原因是&#xff1a;火绒把我们的explorer删除了导致黑屏&#xff0c;这个文…

【OpenGL手册11】材质的模型

目录 一、说明二、材质表面和光照三、设置材质四、光的属性五、不同的光源颜色练习 一、说明 在现实世界里&#xff0c;每个物体会对光产生不同的反应。比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的…

1分钟带你学会使用装饰器编写Python函数

1.需求 向 test() 函数中&#xff0c;新增一个功能&#xff0c;多输出一句话"给他补铁" def test():print("水中放吸铁石") # test()# 第一种方式&#xff1a;重写函数 def test():print("水中放吸铁石")print("给他补铁") test()# …

py脚本模拟json数据,StructuredStreaming接收数据存储HDFS一些小细节 ERROR:‘path‘ is not specified

很多初次接触到StructuredStreaming 应该会写一个这样的案例 - py脚本不断产生数据写入linux本地&#xff0c; 通过hdfs dfs 建目录文件来实时存储到HDFS中 1. 指定数据schema&#xff1a; 实时json数据 2. 数据源地址&#xff1a;HDFS 3. 结果落地位置&#xff1a; HDFS …

高级语言讲义2010软专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

PCB检测,基于YOLOV8NANO

PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;训练得到PT模型&#xff0c;转换成ONNX&#xff0c;只需要OPENCV&#xff0c;支持C/PYTHON/ANDROID开发PCB检测&#xff0c;基于YOLOV8NANO&#xff0c;只需要OPENCV

每日一题leetcode第2834:找出美丽数组的最小和

目录 一.题目描述 二.思路及优化 三.C代码 一.题目描述 二.思路及优化 首先我们看到这个题&#xff0c;就是根据给出的数组元素个数N&#xff0c;从[1&#xff0c;N]找出N个元素&#xff0c;使得N个元素的和最小&#xff0c;其中随便抽两个数出来&#xff0c;两个数之和不能为…

BC134 蛇形矩阵

一&#xff1a;题目 二&#xff1a;思路分析 2.1 蛇形矩阵含义 首先&#xff0c;这道题我们要根据这个示例&#xff0c;找到蛇形矩阵是怎么移动的 这是&#xff0c;我们可以标记一下每次移动到方向 我们根据上图可以看出&#xff0c;蛇形矩阵一共有两种方向&#xff0c;橙色…

【Pytorch】新手入门:基于sklearn实现鸢尾花数据集的加载

【Pytorch】新手入门&#xff1a;基于sklearn实现鸢尾花数据集的加载 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望…

Hadoop运行搭建——系统配置和Hadoop的安装

Hadoop运行搭建 前言&#xff1a; 本文原文发在我自己的博客小站&#xff0c;直接复制文本过来&#xff0c;所以图片不显示(我还是太懒啦&#xff01;)想看带图版的请移步我的博客小站~ Linux镜像&#xff1a;CentOS7 系统安装&#xff1a;CentOS安装参考教程 系统网卡设置…

C语言——函数指针——函数指针变量详解

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

三菱PLC基础指令

LD指令(a触点的逻辑运算开 指令表程序 0000 LD X000 0001 OUT Y000 LDI指令(b触点的逻辑运算开 指令表程序 0000 LDI X000 0001 OUT Y000 3.数据寄存器(D)的位指定*1(仅对应FX3u&#xff0c;FX3uc可编程控制器) 指令表程序 0000 LD D0.3 0001 OUT Y000 4.定时器 0000 LDI X00…

Objects类 --java学习笔记

Objects类 Objects是一个工具类&#xff0c;提供了很多操作对象的静态方法给我们使用 Objects类常用的三个方法 Objects.equals 比直接equals更安全&#xff0c;因为Objects.equals里面做了非空校验 Objects.isNull&#xff08;A&#xff09; 等价于 A null Objects.non…

Redisson学习

简介 Redisson 是一个在 Redis 的基础上实现的 Java 驻留内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它提供了许多分布式 Java 对象和服务&#xff0c;包括分布式锁、分布式集合、分布式执行服务、分布式调度任务等。 使用 依赖 相关依赖&#xff0c;注意版…

【兔子机器人】修改GO电机id(软件方法、硬件方法)

一、硬件方法 利用上位机直接修改GO电机的id号&#xff1a; 打开调试助手&#xff0c;点击“调试”&#xff0c;查询电机&#xff0c;修改id号&#xff0c;即可。 但先将四个GO电机连接线拔掉&#xff0c;不然会将连接的电机一并修改。 利用24V电源给GO电机供电。 二、软件方…

回溯算法12-全排列II(Java/排列数去重操作)

12.全排列II 题目描述 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

Spring Boot整合zxing实现二维码登录

zxing是google的一个二维码生成库&#xff0c;使用时需配置依赖&#xff1a; implementation("com.google.zxing:core:3.4.1") implementation("com.google.zxing:javase:3.4.1") zxing的基本使用 我们可以通过MultiFormatWriter().encode()方法获取一个…

AI预测福彩3D第3弹【2024年3月6日预测】

书接上回&#xff0c;经过连续两期使用人工神经网络对福彩3D进行预测&#xff0c;经过不断的调参优化&#xff0c;并及时总结规律&#xff0c;感觉还是有一定的信心提高七码的命中概率。 今天&#xff0c;咱们继续来验证&#xff0c;直接上今天的统计结果&#xff0c;首先&…

手写分布式配置中心(五)整合springboot(不自动刷新的)

springboot中使用配置方式有四种&#xff0c;分别是environment、BeanDefinition、Value、ConfigurationProperties。具体的原理可以看我之前的一篇文章https://blog.csdn.net/cjc000/article/details/132800290。代码在https://gitee.com/summer-cat001/config-center 原理 …