算法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:本次的内容就到这里了,如果大家感兴趣的话没救请一键三连哦!!!

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

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

相关文章

MySQL数据库从入门到精通(下)

对表做了修改之后&#xff0c;记得点击对应图标按钮重新执行一下。 1.创建角色表 数据库一开始就要设计好&#xff0c;轻易不要改动。一个账号下可能有多个角色&#xff0c;所以我们单独再创建另一个表role用来存储所有的角色信息。其中idrole表示角色id&#xff0c;name表示名…

【NR学习一】NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的关系

NR中的带宽、子载波间隔、PRB数量、FFT点数与采样率之间的运算关系 在5G NR&#xff08;New Radio&#xff09;系统设计中&#xff0c;带宽&#xff08;Bandwidth&#xff09;、子载波间隔&#xff08;Subcarrier Spacing, SCS&#xff09;、资源块&#xff08;Resource Block…

移动烽火HG光猫超密破解

1、查找mac地址 cmd 运行 arp -a 192.168.1.1 2、开启telnet功能 浏览器输入 http://192.168.1.1/cgi-bin/telnetenable.cgi?telnetenable1&key3086F178B450 注释&#xff1a; telnetenable1 开启telnet功能 key 是第一步查询的mac地址&#xff0c;去掉横线、小写…

玩转Matlab-Simscape(初级)- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分1)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分1&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 05 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

Unity里的Time

Time and frame rate management Time类&#xff1a; Time script reference page. 一些常见的属性有&#xff1a; Time.time 返回从游戏开始经历的时间.Time.deltaTime 返回从上帧结束到现在经历的时间&#xff0c;和帧率成反比Time.timeScale 控制时间流逝的因子Time.fixe…

web前端框架设计第八课-表单控件绑定

web前端框架设计第八课-表单控件绑定 一.预习笔记 1.v-model实现表单数据双向绑定 2.搜索数据的实现 3.全选案例实现1—JQ方法 4.单选案例实现 5.数据级联&#xff08;二级级联&#xff09; 6.v-model中的修饰符 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药&#xff0c…

全局异常处理实现

全局异常统一处理 ​ 全局异常处理类通常用于捕获和处理应用程序中发生的所有异常&#xff0c;从而避免在代码的多个地方重复编写异常处理逻辑。 一、全局异常处理方案 ​ 全局异常处理类有多种实现方式&#xff0c;每种方式都有其特定的应用场景和优势。以下是几种常见的全…

如何解决代码循环依赖问题?

今天跟大家一起探讨在日常开发过程中经常会碰到的一个问题&#xff0c;这个问题跟代码的维护工作有很大关系。我们知道任何系统在开发了一段时间之后&#xff0c;随着业务功能和代码数量的不断增加&#xff0c;代码之间的调用和被调用场景也会逐渐变的越来越复杂。各个类或组件…

有趣的css - 卡片翻转效果

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是利用 css3 属性 backface-visibility 让卡片翻转的过渡动画效果。 《有趣的css》系列最新实例通过公众号「设计师工作日常」发布。 目录 整体效果核心代码html 代码css 部分代码 完整…

ICode国际青少年编程竞赛- Python-5级训练场-函数练习2

ICode国际青少年编程竞赛- Python-5级训练场-函数练习2 1、 def get_item(a):Spaceship.step(1)Dev.step(a)Dev.turnLeft()Dev.step(1)Spaceship.step(1)Dev.turnRight()Dev.step(-a)Spaceship.step(1) get_item(3) get_item(2) get_item(3) get_item(1) get_item(5)2、 de…

PDF批量编辑:PDF转HTML批量操作技巧,提升文档格式转换效率

在数字化办公日益普及的今天&#xff0c;PDF&#xff08;Portable Document Format&#xff09;作为一种跨平台的文件格式&#xff0c;广泛应用于各种文档的存储和传输。然而&#xff0c;PDF文件的不可编辑性使得在某些情况下&#xff0c;我们需要将其转换为HTML格式以便更好地…

性价比王者HUSB237,极简PD Sink的“瘦身秘籍”

在小型化、高集成的要求下&#xff0c;慧能泰取电芯片进行技术升级后“瘦身成功”&#xff0c;推出最新一代极具性价比的最简PD Sink取电芯片——HUSB237。 图1&#xff1a;HUSB237 demo及封装图 HUSB237 是一款极具性价比的最简PD Sink取电芯片&#xff0c;支持PD3.1协议包含…

无人售货奶柜:掘金新零售蓝海,

无人售货奶柜&#xff1a;掘金新零售蓝海&#xff0c; 在日新月异的商业浪潮中&#xff0c;无人奶柜犹如一股清新的创业飓风&#xff0c;正以不可阻挡之势吸引着众多创业者的目光。这股新兴力量以其独到之处和庞大的市场蓝海&#xff0c;预示着一场关于健康、便捷消费方式的深…

网络故障快速定位的秘诀 - 基于 AnaTraf 全流量回溯分析

网络故障是每个 IT 从业者都深有体会的头疼问题。当网络出现异常时,如何快速定位故障原因,恢复网络正常运行,是考验运维能力的关键所在。借助 AnaTraf 网络流量分析仪的全流量回溯分析功能,您可以轻松应对各种复杂的网络问题,实现快速故障定位。 1. 网络故障分析的痛点 网络故…

【跟着例子学MySQL】生成统计报告 --分组聚合

文章目录 前言生成报告DISTINCT 关键字GROUP BY 子句GROUP BY 聚合函数HAVING 子句WITH ROLLUP 子句未完待续 前言 举例子&#xff0c;是最简单有效的学习方法。本系列文章以一个贯穿始终的场景&#xff0c;结合多个实例讲解MySQL的基本用法。 ❔ 为什么要写这个系列&#xff…

前端铺子后台管理系统:基于Vue3与Ant Design Vue的轻量级解决方案

一、引言 随着前端技术的飞速发展&#xff0c;构建高效、轻量且易于维护的后台管理系统成为了企业信息化建设的重要一环。前端铺子后台管理系统&#xff0c;作为一款基于Vue的前端框架&#xff0c;结合Ant Design Vue的UI组件库&#xff0c;为企业提供了一个高效、灵活的后台管…

铁路机辆作业移动智能终端的特点是什么?

在铁路机辆作业的现代化进程中&#xff0c;移动智能终端以其独特的优势成为了不可或缺的装备。这些终端以其高度的便携性&#xff0c;使得工作人员能够随时随地处理各种作业任务&#xff0c;极大地提升了工作效率。它们具备出色的抗干扰性和高防护性&#xff0c;能够在复杂多变…

Docker部署MaxKB详细步骤(window系统)

上面章节已经实现了ollama李现部署llama3&#xff0c;并实现了一些简单的问答&#xff0c;但是问答的界面是在命令提示符中&#xff0c;交互很不友好&#xff0c;也不方便局域网其他用户访问&#xff0c;所以这节用docker部署MaxKB实现网页访问llama3&#xff0c;首先电脑上需要…

26版SPSS操作教程(高级教程第二十二章)

目录 前言 粉丝及官方意见说明 第二十二章一些学习笔记 第二十二章一些操作方法 联合分析 假设数据 具体操作 结果解释 联合分析的数据建模 CONJOINT过程语法 汽车偏好研究 具体操作 结果解释 高精统计图 市场占有率模拟 结果解释 结束语 前言 #一路向光而…

STL—string类(1)

一、string类 1、为什么要学习string&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP&#xff08;面向对象…