算法——滑动窗口之最大连续1的个数、将x减到0的最小操作数、水果成篮

news2025/2/26 11:40:53

3.最大连续1的个数

题目:. - 力扣(LeetCode)

题目要求的是给定一个二进制数组 nums 和一个整数 k,如果可以翻转最多 k0 ,则返回 数组中连续 1 的最大个数

按照题目正面去做,还要替换0,很麻烦

反正我们最后要求的是最长子序列

那么我们就用最长子序列的方法来做,把问题转化为求一段最长子序列,其中这个子序列中0的个数不超过K个,那么这个子序列中的0翻转后得到的子序列一定是最长连续1的子序列

那么我们用滑动窗口的题目来做:

(1)进窗口:定义一个计数器来统计当前窗口中0的个数,进窗口时候:如果是0,计数器+1,是1则无视

(2)判断 当前计数器是否大于k,大于则出窗口

(3)出窗口

当right走到如上图所示位置时,就要出窗口,但是出窗口不只是left++这么简单

如果left++,那么left从第二个位置开始走,一开始计数器的值还是大于

k,所以left要一直走,直到计数器的值小于k

题解:

 public int longestOnes(int[] nums, int k) {
         int n = nums.length;
         int len = 0;
         for(int left = 0,right = 0,zero = 0; right < n; right++){
             if(nums[right] == 0){
                 zero++;
             }
             while(zero > k){
                 zero -= 1 - nums[left++];
             }
             len = Math.max(len,right - left + 1);
         }
         return len;
     }

4.将x减到0的最小操作数

题目:. - 力扣(LeetCode)

此题从正面去解非常麻烦,因为用左边还是右边去减是无法判断的

我们利用"正难则反"的策略

题目说每次都是从最左边或者最右边拿一个数来给x减掉,直到x为0,求最小的操作数

那么我们可以把题目转化为:求最长的子数列,要求子序列的和为 "数组和 - x"

这样就转化为我们熟悉的题目了

此类题目依旧可以用滑动窗口来解决

(1)进窗口:利用sum来表示当前窗口的元素和,sum += nums[right]

(2)判断:sum > targret ,则出窗口

(3)出窗口:sum -= target,直到sum < target(这里在前几题已说明)

题解:

 
class Solution {
     public int minOperations(int[] nums, int x) {
         int n = nums.length;
         int min = n + 1;
         int s = 0;
         for(int t : nums){
             s += t;
         }
         for(int right = 0,left = 0,target = s - x,sum = 0; right < n; right++){
             sum += nums[right];
             while(sum > target && left <= right){
                 sum -= nums[left++];
             }
             if(sum == target){
                 min = Math.min(min,n - (right - left + 1));
             }
         }
         return min == n + 1 ? -1 : min;
     }
 }

5.水果成篮

题目:. - 力扣(LeetCode)

题目转化:找一个最长子序列,子序列中的水果类型不超过两种

我们很容易想到暴力解法,即暴力枚举出所有的结果,其中可以利用哈希表检查水果的类型数量

我们可以在暴力枚举的方法上进行优化:

(1)当right到达如图所示的位置时,如果用暴力解法,那么left++后,right要从left的位置开始遍历.但是事实上不必如此.right还是在原来的位置,因为之前的类型中已经记录下right之前的水果类型数目.那么这就是我们的滑动窗口

(2)在出窗口时,不仅仅是left++

如上图:即使left++后,水果类型的数据还是大于2,因此我们应该一直让left++,直到水果类型数目小于等于2

那么其中就要记录下每种水果的数目,每次出窗口都要让当前类型的水果-1,假设某种水果的数量为0,则类型-1

我们可以利用Map的键值对来解决这个问题

题解:

(1)进窗口:每次将fruits[right]的水果数目+1

(2)判断当前水果类型数目是否大于2

(3)出窗口(按照上面的要求)

 class Solution {
     public int totalFruit(int[] fruits) {
         Map<Integer,Integer> type = new HashMap<>();
         int count = 0;
         int n = fruits.length;
         for(int left = 0, right = 0; right < n; right++){
             type.put(fruits[right],type.getOrDefault(fruits[right],0)+1);
             while(type.size() > 2){
                 int tmp = fruits[left];
                 type.put(tmp,type.get(tmp)-1);
                 if(type.get(tmp) == 0){
                     type.remove(tmp);
                 }
                 left++;
             }
             count = Math.max(count,right-left+1);
         }
         return count;
     }
 }

但是当我们提交时还是会发现时间复杂度偏大,我们看看题目的数据范围:

也就是我们没必要设置一个Map,我们是知道数据的范围的

所以进行优化,引进一个num来代表水果的类型数量

 class Solution {
     public int totalFruit(int[] fruits) {
         int n = fruits.length;
         int[] type = new int[n + 1];
         int count = 0;
         for(int left = 0, right = 0, num = 0; right < n; right++){
             if(type[fruits[right]] == 0){
                 num++;
             }
             type[fruits[right]]++;
             while(num > 2){
                 int tmp = fruits[left];
                 type[tmp]--;
                 if(type[tmp] == 0){
                     num--;
                 }
                 left++;
             }
             count = Math.max(count,right-left+1);
         }
         return count;
     }
 }

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

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

相关文章

算法C++

枚举 1.化段为点 前缀和 eg:给一个数列&#xff0c;算x到y个数的和 #include <iostream> #include <vector> using namespace std;int main() {int n;cin>>n;vector<int> a(n);vector<int> sum(n1,0);for(int i0;i<n;i){scanf…

三种食物轮流吃,睡眠时间又长又香!

睡眠质量一直是人们关注的焦点&#xff0c;而饮食则被认为是影响睡眠的重要因素之一。近年来&#xff0c;有一种食物搭配方法备受瞩目&#xff0c;据说可以让人们的睡眠时间又长又香。这种方法并不复杂&#xff0c;只需要轮流食用三种特定食物&#xff0c;就能有效改善睡眠质量…

好用的AI模型集合

AI-Chat 这个网站提供的AI-Chat 3.5和AI-Chat 4.0聊天机器人&#xff0c;每天都可以免费使用。 不管是学习、工作还是日常生活&#xff0c;都能给我们带来很大的帮助&#xff0c;效率真的可以说是翻倍了。我觉得&#xff0c;如果你想让自己的生活更加高效、更加有序&#xff0…

Groovy - 大数据共享搜索配置

数据共享搜索列中配置了搜索列&#xff0c;相应的数据共享接口中也需要支持根据配置的字段搜索&#xff0c;配置实体时&#xff0c;支持搜索的入参code必须是searchKeys&#xff0c;且接口应该是需要支持分页&#xff08;入参必须是 current、pageSize&#xff09;的。current …

如何利用IP代理高效采集产品数据,打造爆品?

文章目录 一、什么是网络爬虫&#xff1f;二、普通人如何通过网络爬虫赚钱&#xff1f;2.1、心得分享2.2、工具自动化收集信息 三、 动态IP代理3.1、覆盖范围3.2、性价比3.3、教程中心F&Q使用教程 3.4、在网络数据采集中的重要性 四、实战应用案例一&#xff1a;ebay电商【…

树莓派驱动编译

驱动编译前提&#xff1a;驱动代码的编译需要提前编译号的内核 驱动&#xff08;3种实现方法&#xff0c;2条路线&#xff09;_驱动编写三种方法-CSDN博客 驱动的编写_驱动编写-CSDN博客 一、概念 1.1、驱动认识 1、裸机程序中是直接操控硬件的&#xff0c;操作系统…

【论文笔记】Attention Is All You Need

【论文笔记】Attention Is All You Need 文章目录 【论文笔记】Attention Is All You NeedAbstract1 Introduction2 Background补充知识&#xff1a;软注意力 soft attention 和硬注意力 hard attention&#xff1f;补充知识&#xff1a;加法注意力机制和点乘注意力机制Extende…

JavaScript的书写方式

JavaScript的书写方式 目前较为流行的是第二种和第三种&#xff0c;第一种很少见。在第二种和第三种推荐使用第三种&#xff0c;因为在日常开发/工作中&#xff0c;第三种是最为常见的 1.行内式 把JS代码嵌入到html元素内部 示例代码 运行效果 由于JS中字符串常量可以使用单引…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

微调(Fine-tuning)技术概念

——微调&#xff0c;像化妆&#xff0c;一种“精细化、风格性调整”的人工美颜技能。 微调&#xff08;Fine-tuning&#xff09;是指在深度学习领域中&#xff0c;特别是针对预训练模型的一种训练策略。预先训练好的模型通常是在大规模无标注数据上通过自监督学习得到的&#…

Python股票数据,指数月线涨跌幅回测系统

1.这是我用Python写的&#xff0c;目前无法给大家直接使用exe&#xff0c;因为编译后软件不能正常使用。但是py源码可以先开源&#xff0c;给大家学习一下&#xff0c;里面的代码&#xff0c;都有我的注释&#xff0c;需要你有编程基础就可以看懂&#xff0c;自己可以在这个基础…

nginx(三)实现反向代理客户端 IP透传

正常情况下&#xff0c;客户端去访问代理服务器&#xff0c;然后代理服务器再取访问真实服务器&#xff0c;在真实服务器上&#xff0c;只能显示代理服务器的ip地址&#xff0c;而不显示客户端的ip地址&#xff0c;如果想让客户端的ip地址也能在真实服务端看见&#xff0c;这一…

程序员缺乏经验的 7 种表现!

程序员缺乏经验的 7 种表现&#xff01; 一次性提交大量代码 代码写的很烂 同时开展多项工作 性格傲慢 不能从之前的错误中学到经验 工作时间处理私人事务 盲目追逐技术潮流 知道这些表现&#xff0c;你才能在自己的程序员职业生涯中不犯相同的错误。 软件行业的工作经…

FastAPI框架整理

文章目录 一、Starlette、Pydanatic与FastAPI的关系1.Starlette1.1ASGI框架 2.Pydantic2.1基础教程1.定义接受实体2.请求参数3.可以安装插件辅助数据定义和矫正4.处理校验失败的例子5.模型的属性和方法6.解析文件7.递归模型8.ORM模型&#xff1a;从类实例创建符合ORM对象的模型…

FPGA高端项目:FPGA基于GS2971的SDI视频接收转HDMI输出,提供3套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI图像缩放应用本方案的SDI纯verilog图像缩放视频拼接应用本方案的SDI HLS图像缩放视频拼接应用本方案的SDI视频编码动态字符叠加输出应用本方案的SDI视频编码多路视频融合视频叠加应用本方案的SDI视频…

追踪Jira中项目成本与工时,更符合国人使用习惯——TimeWise工时管理

近日&#xff0c;龙智联合Atlassian举办的DevSecOps研讨会年终专场“趋势展望与实战探讨&#xff1a;如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队&#xff0c;以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0…

opencv中的rgb转gray的计算方法

转换原理 在opencv中&#xff0c;可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下&#xff0c; import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

Transformer之Residuals Decoder

The Residuals 我们需要提到的编码器架构中的一个细节是&#xff0c;每个编码器中的每个子层(self-attention,&#xff0c;ffnn)周围都有一个残余连接&#xff0c;然后是 layer-normalization 步骤。 如果我们要可视化向量和与 self attention 相关的 layer-norm 运算&#x…

计算机专业大学四年应该如何规划(Java方向)

计算机专业的学生&#xff0c;如何在大学四年内提高自己的竞争力&#xff0c;毕业之后直接进大厂工作&#xff1f; 以下将从大学四年计算机专业的学习规划、课程设置、能力提升、参考书籍等方面&#xff0c;为同学们提供一些建议和指导。 大一&#xff1a; 主攻技能学习并且达…

Excel中使用ROW函数自动更新行号或编号

操作步骤&#xff1a; 1、在编号“1”的单元格输入公式“ROW()-1”&#xff1b; 2、在上一步填好公式的单元格基础上下拉填充&#xff0c;即可批量得到编号&#xff0c;如果删掉其中的一行或几行&#xff0c;编号会自动进行更新。