算法day06

news2024/9/24 23:31:07

第一题

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.coloradmin.cn/o/1677782.html

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

相关文章

ElastiCache Serverless for Redis应用场景和性能成本分析

一. 前言 传统基于实例节点的 Redis 缓存架构中&#xff0c;扩展性是一个重要影响因素。在很多场景中&#xff0c;例如广告投放、电商交易、游戏对战&#xff0c;流量是经常变化的。无论是主从还是集群模式&#xff0c;当大流量进入时&#xff0c;Redis 处理能力达到上限&…

【保姆级介绍下运维】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

爱校对新功能上线:领导人讲话和职务排序校对

我们很高兴地宣布&#xff0c;爱校对网站正式推出两项新功能&#xff1a;领导人讲话校对和领导人职务排序校对。这些新功能旨在帮助用户更准确地引用和整理领导人讲话内容&#xff0c;以及正确排列领导人的职务顺序。 领导人讲话校对 在撰写报告或文章时&#xff0c;引用领导…

数据结构与算法===优先队列

文章目录 前言一、优先队列二、应用场景三、代码实现总结 前言 之前写过很多数据结构与算法相关的了&#xff0c;今天看一个新的数据结构&#xff0c;优先队列。优先队列类似队列&#xff0c;却又优先于队列&#xff0c;是堆实现的。接下来详细看看。 一、优先队列 优先队列一…

Java面试八股之为什么要使用克隆

Java中为什么要使用克隆&#xff1f;怎么实现对象的克隆&#xff1f;深拷贝和浅拷贝的区别是什么 在Java中使用克隆主要有以下几个原因&#xff1a; 创建对象副本&#xff1a;克隆可以快速创建一个与原对象状态完全相同的副本&#xff0c;无需手动逐一复制每个属性。这种情况…

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

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

STM32_HAL_TIM_通用计时器_实现计时

项目思路 1使用定时器计数每秒一次 2使用一个变量记录定时器响应多少次 3使用UART将记录的次数发出 1STM32Cude设置 1配置时钟源 2打开UART 3打开TIM2 3.1界面介绍 3.2选项介绍 Slave Mode&#xff08;从模式&#xff09;&#xff1a;当设备被设置为从模式时&#xff0c…

flowable工作流设置审批人为指定角色+部门的实现方式

一、绘制流程图页面配置 1、指定固定审批角色组织的实现 如上图红框部分&#xff0c;需要修改此处为需求对应。比如此时红框不支持指定某个部门下的指定角色这种组合判断的审批人。则需要修改页面变成选完角色同时也选择上部门统一生成一个group标识。 修改完后&#xff0c;生…

海思Hi3065H 200MHz 高性能 RISCV32 A² MCU

这是一款海思自研的RISCV32内核的高性能实时控制专用MCU&#xff0c; 具有高性能、高集成度、高可靠性、易开发的特点&#xff0c;同时还有嵌入式AI能力。 CPU • RISC-V200MHzFPU 存储 • Up to 152KB Code Flash • 8KB Data Flash • 16KB SRAM 个人认为这是MCU梯队非常…

MES系统在电线电缆行业生产上的应用

MES系统在线缆行业的应用可以带来多重价值&#xff0c;包括提高生产效率、降低生产成本、提高产品质量、优化库存管理、改善生产环境和提高企业竞争力等方面。因此&#xff0c;在电线电缆行业中广泛应用MES系统可以提高企业的经济效益和社会效益&#xff0c;推动企业发展和行业…

Windows本地部署直播录屏利器Bililive-go并实现远程添加直播间录屏

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 1. Bililive-go与套件下载1.1 获取ffmpeg1.2 获取Bililive-go1.3 配置套件 2. 本地运行测试3. 录屏…

5 特征筛选

5 特征筛选 学习目标 掌握单特征分析的衡量指标知道 IV,PSI等指标含义知道多特征筛选的常用方法掌握Boruta,VIF,RFE,L1等特征筛选的使用方法1 单特征分析 什么是好特征?从几个角度衡量:覆盖度,区分度,相关性,稳定性 覆盖度 采集类,授权类,第三方数据在使用前都会分析…

java AOP环绕通知记录操作日志

一.创建数据库日志表 CREATE TABLE uc_system_log (id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID,user_code varchar(64) DEFAULT NULL COMMENT 用户编码,user_name varchar(128) DEFAULT NULL COMMENT 用户名称,is_login tinyint(4) NOT NULL DEFAULT 0 COMMENT 是…

吴恩达深度学习笔记:优化算法 (Optimization algorithms)2.3-2.5

目录 第二门课: 改善深层神经网络&#xff1a;超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第二周&#xff1a;优化算法 (Optimization algorithms)2.3 指数加权平均数&#xff08;Exponential…

Java-数据库连接(JDBC小白教学)

&#xff01;文章最后附有完整代码&#xff01; 目录 &#x1f516;JDBC概述 &#x1f516;JDBC连接数据库 &#x1f516;添加数据&#xff08;insert&#xff09; &#x1f516;修改数据&#xff08;Update&#xff09; &#x1f516;删除数据&#xff08;delete&#x…

边缘计算教学实训解决方案

一、引言 随着物联网、5G通信技术的快速发展&#xff0c;边缘计算作为云计算的延伸和补充&#xff0c;正逐渐成为支撑智能物联网、实时数据分析等领域的重要技术。唯众旨在为职业院校设计一套全面的边缘计算教学实训体系&#xff0c;通过理论与实践相结合的方式&#xff0c;培…

深度剖析MyBatis的二级缓存

二级缓存的原理 MyBatis 二级缓存的原理是什么&#xff1f; 二级缓存的原理和一级缓存一样&#xff0c;第一次查询会将数据放到 缓存 中&#xff0c;然后第二次查询直接去缓存读取。但是一级缓存是基于 SqlSession 的&#xff0c;二级缓存是基于 mapper 的 namespace 的。也就是…

webhook 和 API:你了解吗

Webhooks 是许多 API 的补充。通过设置 webhook 系统&#xff0c;系统 B 可以注册接收有关系统 A 某些更改的通知。当更改发生时&#xff0c;系统 A 推送 更改到系统 B&#xff0c;通常是以发出 HTTP POST 请求的形式。 Webhooks 旨在消除或减少不断轮询数据的需要。但根据我的…

如何购买RAKsmart的国外高防服务器?

随着互联网的快速发展&#xff0c;网络安全问题日益凸显&#xff0c;特别是对于拥有在线业务的企业或个人来说&#xff0c;选择一款高防服务器显得尤为关键。美国RAKsmart作为知名的服务器提供商&#xff0c;其高防服务器因其卓越的性能和安全性&#xff0c;受到了广大用户的青…

一步一步带你做网络工程

网络工程怎么做 一、网络设备交换机的应用&#xff1a; 要求&#xff1a;在此接入交换机S3700&#xff0c;上划分两个vlan&#xff0c;vlan10和vlan20分别有两个PC&#xff0c;按拓扑图完成要求&#xff1a; 划分vlan添加端口 sys [Huawei]sys S1 [S1]undo in e [S1]undo t…