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

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;
     }
 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++学习记录 deque容器—插入和删除

1、函数原型 1.1 两端插入操作&#xff1a; push_back(elem); //在容器尾部添加一个数据push_front(elem); //在容器头部插入一个数据pop_back(); //删除容器最后一个数据pop_front(); //删除容器第一个数据 1.2 指定…

【Python笔记-设计模式】备忘录模式

一、说明 备忘录模式是一种行为设计模式&#xff0c;允许在不暴露对象实现细节的情况下保存和恢复对象之前的状态。 (一) 解决问题 主要解决在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在对象之外保存这个状态&#xff0c;以便在需要时恢复对象…

Restful风格解释

示例对比 传统风格开发 Restful风格开发 结论&#xff1a; 传统风格开发中&#xff0c;前端不同操作使用不同的url来访问后端&#xff0c;使得访问变得麻烦restful风格中&#xff0c;前端使用相同的url来访问后端&#xff0c;但是用数据传送方式进行区分&#xff08;get为请求…

鸿蒙OS应用编程实战:构建未来应用的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 鸿蒙OS&#xff08;HarmonyOS&#xff0…

vue3 构建项目

一.使用vite构建&#xff1a; npm init vitelatest 项目名称 构建的项目模板 进入项目 cd 项目名称 安装项目依赖包 npm install 启动项目 npm run dev 二.使用vue脚手架构建&#xff1a; npm init vuelatest 后续基本差不多

Docker本地部署GPT聊天机器人并实现公网远程访问

文章目录 前言1. 拉取相关的Docker镜像2. 运行Ollama 镜像3. 运行Chatbot Ollama镜像4. 本地访问5. 群晖安装Cpolar6. 配置公网地址7. 公网访问8. 固定公网地址9. 结语 前言 随着ChatGPT 和open Sora 的热度剧增,大语言模型时代,开启了AI新篇章,大语言模型的应用非常广泛&…

练习 1 Web EasySQL极客大挑战

CTF Week 1 EasySQL极客大挑战 BUUCTF 典中典复习 Web SQL 先尝试输入&#xff0c;找一找交互页面 check.php 尝试万能语句 a’ or true SQL注入&#xff1a;#和–的作用 get传参只能是url编码&#xff0c;注意修改编码&#xff0c;输入的字符串要改成url格式。 POST请求和…

机器视觉——硬件选型

1、相机选型 在选择机器视觉相机时&#xff0c;通常需要考虑以下几个方面&#xff1a; 1、分辨率&#xff1a;相机的分辨率决定了其拍摄图像的清晰度和细节程度。根据具体的应用需求&#xff0c;可以选择适当的分辨率范围。 2、帧率&#xff1a;帧率表示相机每秒钟能够拍摄的…

文献速递:帕金森的疾病分享--使用机器学习方法挖掘影像和临床数据以诊断和早期检测帕金森病

文献速递&#xff1a;帕金森的疾病分享–使用机器学习方法挖掘影像和临床数据以诊断和早期检测帕金森病 Title 题目 Mining imaging and clinical data with machine learning approaches for the diagnosis and early detection of Parkinson’s disease 使用机器学习方法…

Redisson限流算法

引入依赖 <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.12.3</version> </dependency>建议版本使用3.15.5以上 使用 这边写了一个demo示例&#xff0c;定…

Html零基础入门教程(非常详细)

文章目录 1.认识HTML2.html 框架3.HTML常见标签4.HTML语法特征5.列表 1.认识HTML html是超文本标记语言: 目前最新版本是html5,由w3c(万维网联盟)完成标准制定。 声明文档的类型是html5 超文本标记语言。 HTML &#xff0c;全称“Hyper Text Markup Language&#xff08;超文…

Python是垃圾?千万不要再学Python了?

“人生苦短&#xff0c;快学Python”这句话&#xff0c;相信大家都有看到过&#xff0c;但是有细心留意过&#xff0c;就会发现Python其实在网上的评价褒贬不一&#xff0c;有好评&#xff0c;也有差评。这就会给那些不懂Python却想要学Python的一些人造成困惑&#xff0c;我到…

mongo之常用数据库操作

目录 一、准备环境 二、日常记录及执行示范 连接数据库查询版本查询表总数模糊查询(使用正则)查询文档中数据条数排序大于等于查询有哪些库时间查询不在条件内的查询复制数据更新字段名称删除数据库 四、高阶查询 五、备份迁移数据库 总结 一、准备环境 借鉴&#xff1a;…

【算法分析与设计】最大二叉树

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最…

Logic Pro:专业音乐制作软件,为你的音乐插上翅膀

Logic Pro是一款功能强大的音乐制作软件&#xff0c;专为专业音乐人和音乐爱好者设计。它提供了全面的音乐创作工具&#xff0c;包括音频录音、编辑、混音、合成以及自动化等功能&#xff0c;让你能够轻松实现音乐梦想。 Logic Pro软件获取 首先&#xff0c;Logic Pro拥有卓越…

关于网站的保姆级攻略

什么是域名&#xff1f; 域名是互联网上用于识别和定位计算机和网络服务的字符串。它提供了一个便于人们记忆和使用的名称&#xff0c;用来代替复杂的IP地址&#xff0c;可用于从客户端浏览器&#xff08;Chrome、EDGE&#xff09;访问网站。简单来说&#xff0c;域名是用户在浏…

这一次,彻底解决滚动穿透

什么是滚动穿透 如图所示&#xff0c;有一层遮罩蒙层覆盖在body上时&#xff0c;当我们滚动遮罩层&#xff0c;它下面的内容也会跟着一起滚动&#xff0c;看起来好像是上面的滚动事件穿透到下面的DOM元素上一样&#xff0c;我们称之为滚动穿透。 阻止冒泡&#xff1f; 刚开始…

Window系统禅道BUG管理系统安装配置并实现公网远程访问

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

【Linux】进程信号 --- 信号的产生 保存 捕捉递达

文章目录 信号的感知信号的结构描述 一、信号的产生1.通过键盘发送信号2.通过系统调用发送信号 二、信号的保存&#xff08;PCB内部的两张位图和一个函数指针数组&#xff09;理解三张数据结构表block pending haldler 三、通过代码编写 理解 信号的保存和递达1.信号集操作的库…

看到递归就晕?带你理解递归的本质!【基础算法精讲 09】

104 . 二叉树的最大深度 链接 : . - 力扣&#xff08;LeetCode&#xff09; 思路 : 对于题意&#xff0c;可以拆分为 : ans max(左子树的最大深度 &#xff0c; 右子树的最大深度) 1 ; 原问题 : 计算整颗树的最大深度 &#xff1b; 子问题 : 计算左右子树的最大深度 ;…