算法day06

第一题

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

如题上述:

        本题原来的意思给定一个数字x,从数组的左边或者右边 使用x减去数组中的数字,直到减去最后一个数字为0时,返回最小的操作次数;如果最终减去的数组中的数字之后不能得到0,则返回-1;

        我们由正难则反原理将题意转化为如下所示:

        如上图所示,我们使用滑动窗口模型,让窗口内的子数组之和为sum-x,左边区域和右边区域的数组之和为x,为了保证左右区间的数组长度最小,则中间区域的数组长度需要最长;

        故此解题步骤如下所示:

步骤一:

        定义左右双指针;

步骤二:

        进窗口:

        右指针移动一位,并记录sum在案;

步骤三:

        判断出窗口操作:

        如果tar>sum-x,则开始出窗口操作,直到不满足刚刚上述条件;

        所谓出窗口操作则是,sum减去当前左指针所指的数值,并且左指针右移一位;

        注意每一次出完窗口操作之后要更新中间数组区域的长度;

最后返回的结果是-1or整个数组长度-之前记录的数组长度;

        综上所述,代码如下:

class Solution {public int minOperations(int[] nums, int x) {int sum =  0;for(int a : nums){sum += a;}int tar = sum - x;if(tar < 0){return -1;}int temp = 0,res = -1;for(int left = 0,right = 0;right < nums.length;right++){temp += nums[right];while(temp > tar){temp -= nums[left++];}if(temp == tar){res = Math.max(res,right-left+1);}}if(res == -1){return res;}else{return nums.length-res;}}
}

第二题

        904. 水果成篮  

 由上题可知:

        本题的意思可以转化为在一个最长的数组,且里面的元素种类不能超过2;

        本题采用滑动模块的思想,解题步骤如下所示:

步骤一:

        定义左右双指针;

步骤二:

        进窗口操作:

        右指针移动一位,将其所指的元素放在hash表里面

步骤三:

        判断操作:

        当hash表的长度大于2时,hash表中左指针的元素先-1,判断左指针所值的元素是否是否为0,如果为零,将该元素移除hash表,反之不然,同时将左指针向前移动一位;即完成出窗口操作,最后更新当前窗口的长度并记录在案;

        返回最长的窗口的长度;

        代码如下所示:

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

下面用数组代表hash表,如下所示:

class Solution {public int totalFruit(int[] fruits) {   int res = 0,n = fruits.length;int[] hash = new int[n+1];for(int left = 0,right = 0,kinds = 0;right < n;right ++){int in = fruits[right];if(hash[in] == 0){kinds++;}hash[in]++;while(kinds > 2){int out = fruits[left]; hash[out] --;if(hash[out]== 0){kinds --;}left ++;}res = Math.max(res,right-left+1);}return res;}
}

 第三题

438. 找到字符串中所有字母异位词

题目如上所示:

        首先如何能够快速的判断出相同的异位词,只有采用hash表;

        其次本次采用滑动窗口和hash表的方法来解决;

解题步骤如下:

步骤一:

        定义所有双指针;

步骤二:进窗口

         当前右指针所指的字符映射到hash表中的位置中,该位置上记录的是该元素当前在窗口中的数目;每当有字符进入到窗口,其对应的hash表中的相应位置会记录该字符的存在数量;

步骤三:

        当前左右指针所指的窗口的长度是否和固定数组的长度m比较:

        窗口长度大于m:

                在hash表中减去当前左指针所映射位置的数量,即该元素所记录的数量减一,同时左指针向右移动一位;

        此时得到一个新的窗口,这时候要更新我们的结果,即检查两个hash表是否一致;

步骤四:关于两个hash表进行比较的简单方法:

        

        如图所示,定义一个count变量,来记录有效hash2表中字符的总数量,如当前hash1中需求有效字符数量为3,所以我们需要确定更新结果的前提就是hash2中所统计的count=3时,就要返回该子数组的第一个元素下标,详细加分析如下所示:

        进窗口后:如果当前该字符对应hash表中的记录数目小于该元素的有效数目,则count变量加一;

        出窗口前:如果当前该字符对应hash表中的记录数目小于该元素的有效数目,则count变量减一;

        当所记录的count==需要的值m时,我们要更新结果:

其中代码如下所示:

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ret = new ArrayList<Integer> ();char[] s1 = s.toCharArray();char[] p1 = p.toCharArray();int[] hash1 = new int[26];for(char ch: p1){hash1[ch-'a']++;}int[] hash2 = new int[26];int m = p1.length;for(int left = 0,right = 0,count =0;right < s1.length;right++){char in = s1[right];hash2[in -'a']++;if(hash2[in-'a']<=hash1[in-'a']){count++;}if(right - left + 1 > m){char out = s1[left++];if(hash2[out-'a'] <= hash1[out-'a']){count--;}hash2[out-'a']--;}if(count == m){ret.add(left);}}return ret;}
}

ps:本次的内容就到这里了,如果大家感兴趣的话没救请一键三连哦!!!

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

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

相关文章

HR系统组合漏洞挖掘过程

前言 某天在项目中遇到了一个奇怪的人才管理系统&#xff0c;通过FOFA&#xff08;会员可在社区获取&#xff09;进行了一番搜索&#xff0c;发现了该系统在互联网上的使用情况相当广泛。于是&#xff0c;我开始了后续的审计过程。 在搜索过程中&#xff0c;我偶然间找到了一份…

Nginx静态压缩和代码压缩,提高访问速度!

一、概述 基于目前大部分的应用&#xff0c;都使用了前后端分离的框架&#xff0c;vue的前端应用&#xff0c;也是十分的流行。不知道大家有没有遇到这样的问题&#xff1a; 随着前端框架的页面&#xff0c;功能开发不断的迭代&#xff1b;安装的依赖&#xff0c;不断的增多&a…

无人机的用途

无人机&#xff0c;即无人驾驶飞机&#xff0c;其用途广泛且多样&#xff0c;涉及到多个领域。 在农业领域&#xff0c;无人机通过搭载各种传感器和相机&#xff0c;可以对农田进行空中巡视&#xff0c;收集农田数据&#xff0c;如土壤含水量、气温、湿度等&#xff0c;以及植…

Ubuntu系统如何使用宝塔面板搭建HYBBS论坛并发布公网远程访问

文章目录 前言1. HYBBS网站搭建1.1 HYBBS网站安装1.2 HYBBS网站测试1.3. cpolar的安装和注册 2. 本地网页发布2.1.Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3.公网访问测试总结 前言 在国内…

【智能算法】河马优化算法(HO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年&#xff0c;MH Amiri受到自然界河马社会行为启发&#xff0c;提出了河马优化算法&#xff08;Hippopotamus Optimization Algorithm, HO&#xff09;。 2.算法原理 2.1算法思想 …

【C++】AVL

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、AVL 树 1.1、AVL树的概念 1.2、AVL树节点的定义 1.3、AVL树的插入 1.4、AVL树的旋转 1.4.1、新节点插入较高左子树的左侧---左左&#xff1a;右单旋 1…

Spring整体流程源码分析

DisableEncodeUrlFilter 防止sessionId被泄露 包装器模式 WebAsyncManagerIntegrationFilter WebAsyncManagerIntegrationFilter通常与Spring MVC的异步请求处理机制一起使用&#xff0c;确保在使用Callable或DeferredResult等异步处理方式时&#xff0c;安全上下文能够正…

CSP备考---位运算

前言 本期我们将学习位运算&#xff0c;与本期类型的考点&#xff08;二进制转换&#xff09;反码、补码、原码。 1、位运算是什么 首先我们需要先了解位运算是什么。 我们知道&#xff0c;计算机中的数在内存中都是以二进制形式进行存储的 &#xff0c;而位运算就是直接对整…

打造本地GPT专业领域知识库AnythingLLM+Ollama

如果你觉得openai的gpt没有隐私&#xff0c;或者需要离线使用gpt&#xff0c;还是打造专业领域知识&#xff0c;可以借用AnythingLLMOllama轻松实现本地GPT. AnythingLLMOllama 实现本地GPT步聚&#xff1a; 1 下载 AnythingLLM软件 AnythingLLM官网地址&#xff1a; Anythi…

功能卓越,未来可期!实在Agent智能体公测圆满收官

“被需要的智能才是实实在在的智能。”一直以来&#xff0c;实在智能始终坚持从行业本质出发思考如何围绕客户需求打造更智能、更普惠的智能体数字员工&#xff0c;切实关注用户真实的使用体验与感受。 自2020年7月起&#xff0c;实在智能率先推出第一代实在RPA数字员工&#…

SpringBoot设置默认文件大小

1、问题发现 有个需求&#xff0c;上传文件的时候&#xff0c;发现提示了这个错误&#xff0c;看了一下意思是说&#xff0c;文件超过了1M。 看我们文件的大小&#xff1a; 发现确实是&#xff0c;文件超出了1M&#xff0c;查了一下资料&#xff0c;tomcat默认上传文件大小为1M…

简单粗暴的翻译英文pdf

背景&#xff1a;看书的时候经常遇到英文pdf&#xff0c;没有合适的翻译软件可以快速翻译全书。这里提供一个解决方案。 Step 1 打开英文pdfCTRLA全选文字CTRLC复制打开记事本CTRLV复制保存为data.txt Step 2 写一个C脚本 // ToolPdf2Html.cpp : 此文件包含 "main&quo…

大型语言模型自我进化综述

24年4月来自北大的论文“A Survey on Self-Evolution of Large Language Models”。 大语言模型&#xff08;LLM&#xff09;在各个领域和智体应用中取得了显着的进步。 然而&#xff0c;目前从人类或外部模型监督中学习的LLM成本高昂&#xff0c;并且随着任务复杂性和多样性的…

C# WinForm —— 18 NumericUpDown 介绍

1. 简介 数字显示框&#xff0c;通过向上、向下按钮来 增加/减小 显示的数值 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 numUD 开头Hexadecimal数值 up-down 控件的值是否应以十六进制显示Increment每单击一下按钮&#xff0c;增加或减…

音源分离|Music Source Separation in the Waveform Domain

一、文章摘要 本文中&#xff0c;比较了两种时域结构。首先将最初为语音源分离而开发的卷积tasnet应用于音乐源分离任务。虽然ConvTasnet击败了许多现有的频域方法&#xff0c;但正如人类评估所显示的那样&#xff0c;它存在明显的artifacts。本文提出了一种新的时域模型Demucs…

鸿蒙内核源码分析 (协处理器篇) | CPU 的好帮手

本篇很重要&#xff0c;对CP15协处理所有16个寄存器一一介绍&#xff0c;可能是全网介绍CP15最全面的一篇&#xff0c;鸿蒙内核的汇编部分(尤其开机启动)中会使用&#xff0c;熟练掌握后看汇编代码将如虎添翼。 协处理器 协处理器 (co-processor) 顾名思义是协助主处理器完成…

韵搜坊(全栈)-- 前后端初始化

文章目录 前端初始化后端初始化 前端初始化 使用ant design of vue 组件库 官网快速上手&#xff1a;https://www.antdv.com/docs/vue/getting-started-cn 安装脚手架工具 进入cmd $ npm install -g vue/cli # OR $ yarn global add vue/cli创建一个项目 $ vue create ant…

社交媒体数据恢复:默往

如果你在默往社交软件中丢失了重要的数据&#xff0c;不要着急&#xff0c;以下是一些步骤可以帮助你进行数据恢复&#xff1a; 登录账号&#xff1a;首先&#xff0c;你需要登录默往社交软件账号&#xff0c;确保你已经登录了正确的账号&#xff0c;因为如果你登录了错误的账号…

弘君资本策略:股指预计保持震荡上扬格局 关注公用事业、电网设备等板块

弘君资本指出&#xff0c;周一A股商场探底上升、小幅震动收拾&#xff0c;早盘股指低开后震动回落&#xff0c;沪指盘中在3126点附近取得支撑&#xff0c;午后股指企稳上升&#xff0c;盘中电网设备、公用事业、电力以及工程建造等职业体现较好&#xff1b;半导体、互联网以及软…

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…