代码随想录算法训练营 || 贪心算法 435 763 56

news2025/1/12 7:46:28

Day31

435. 无重叠区间

力扣题目链接

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例 1:

  • 输入: [ [1,2], [2,3], [3,4], [1,3] ]

  • 输出: 1

  • 解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

  • 输入: [ [1,2], [1,2], [1,2] ]

  • 输出: 2

  • 解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

  • 输入: [ [1,2], [2,3] ]

  • 输出: 0

  • 解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路

  • 上一道题引爆气球,是要找最小发出的箭数,排序后进行循环,如果两个气球重合(前右比后左大),那箭的数量不用加一,更新覆盖范围继续循环

  • 这个题目和上一题思路类似,我们要找最少移除多少个区间之后能让剩下的区间不重叠,也可以找最大有多少区间是可以不重叠的,找到之后用数组长度减掉这个数字即可

  • 排序后遍历,如果重叠了,count不增,更新范围看下一个区间是否也和这两个区间重叠,如果还重叠就继续更新,如果不重叠就count++

代码

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));//排序
        int count = 1;
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {//前右大于后左,这两个区间重叠了
                intervals[i][1] = Math.min(intervals[i - 1][1],intervals[i][1]);//要看下一个区间是不是和他们俩都重叠
            } else count++;//不重叠,更新不重叠区间的数量
        }
        return intervals.length - count;//返回的就是要想让区间互不重叠,需要移除的子空间数
    }
}

763.划分字母区间

力扣题目链接

字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。

示例:

  • 输入:S = "ababcbacadefegdehijhklij"

  • 输出:[9,7,8] 解释: 划分结果为 "ababcbaca", "defegde", "hijhklij"。 每个字母最多出现在一个片段中。 像 "ababcbacadefegde", "hijhklij" 的划分是错误的,因为划分的片段数较少。

思路

  • 先遍历一遍数组,用一个数组作哈希表,存放每个字母最后出现的位置

  • 再遍历数组,不断更新right边界,直到走到最远且下标相等的边界,把数字加入list中,因为要取字符串长度,所以还需要更新一个left边界

  • 在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

可以分为如下两步:

  • 统计每一个字符最后出现的位置(temp数组记录)

  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

代码

class Solution {
    public List<Integer> partitionLabels(String s) {
        List<Integer> res = new ArrayList<>();
        int[] temp = new int[26];
        for (int i = 0; i < s.length(); i++){
            temp[s.charAt(i) - 'a'] = i;
        }
        int right = 0;
        int left = 0;
        for (int i = 0; i < s.length(); i++){
            right = Math.max(right,temp[s.charAt(i) - 'a']);
            if (right == i){
                res.add(right - left + 1);
                left = i + 1;
            }
        }
        return res;
    }
}

56. 合并区间

力扣题目链接

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

  • 输入: intervals = [[1,3],[2,6],[8,10],[15,18]]

  • 输出: [[1,6],[8,10],[15,18]]

  • 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

  • 输入: intervals = [[1,4],[4,5]]

  • 输出: [[1,5]]

  • 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

思路

  • 和之前思路差不多,但我们这次输出的不是一个数字,而是合并后的数组,因此需要把left也进行标记

  • 循环时如果不重叠,就把之前的加入res中,然后更新left和right

  • 如果重叠了,只更新right即可,要求最大的

  • 最后别忘了把末尾区间加入res

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        LinkedList<int[]> res = new LinkedList<>();
        int left = intervals[0][0];
        int right = intervals[0][1];//记录初始left和right位置
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] > right) {//这个区间和之前的不重叠
                res.add(new int[]{left,right});//需要把之前的区间加入res中
                left = intervals[i][0];//然后更新left和right
                right = intervals[i][1];
            } else {//这个区间和之前的也重叠了
                right = Math.max(right, intervals[i][1]);//left不用更新,因为之前的一定更小,把right进行更新
            }
        }
        res.add(new int[]{left,right});//别忘了最后一个区间也要加入res
        return res.toArray(new int[res.size()][]);
    }
}

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

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

相关文章

TryHackMe-hackerNote

hackerNote 自定义 Web 应用程序&#xff0c;引入用户名枚举、自定义单词列表和基本权限提升漏洞。 端口扫描 循例 nmap Web 80和8080都是一样的页面&#xff0c;并且存在一个登录页面 除此之外还有另一个信息就是它只有一个用户 存在注册功能&#xff0c;我们注册一个用户…

AntDB数据库首个社区版正式发布,携手生态更多可能

3月1日&#xff0c;亚信科技AntDB数据库社区版正式开放免费下载。作为AntDB数据库的首个社区版产品&#xff0c;AntDB-CE&#xff08;Community Edition &#xff09; V7.2.0具有完整、易用、兼容度高的企业级分布式数据库产品特性&#xff0c;提供了详细的在线文档支持&#x…

Kafka基本原理

总述 简介 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各…

高清无线手机投屏电脑软件Airserver7全平台兼容

Airserver是一款优质的手机投屏软件&#xff0c;搭配了可调节的分辨率模式&#xff0c;针对不同的网络配置&#xff0c;还专门研发了低数据模式以及硬件加速功能&#xff0c;全方位保证投屏画面的清晰度。除此之外&#xff0c;通过调整画面的色彩变化&#xff0c;还可以增强用户…

OpenWrt介绍及编译基础教程

关于OpenWrt OpenWRT是一个高度模块化、高度自动化的嵌入式Linux系统&#xff0c;拥有强大的网络组件和扩展性&#xff0c;常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。 同时&#xff0c;它还提供了100多个已编译好的软件&#xff0c;而且数量还在…

SC12B触摸感应芯片评测方案(1)

MM32F0160SC12B Touch Application Evaluation 文章目录MM32F0160SC12B Touch Application EvaluationIntroduction & RequirementHardwareSC12B & SC12B Sample Demo boardMini-F0160 boardSoftwareMCU Software - MM32F0160PC Tool - FreeMASTERSummaryIntroduction …

Jupyter Lab | “丢下R,一起来快乐地糟蹋服务器!”

写作前面 工具永远只是为了帮助自己提升工作效率 —— 沃兹基硕得 所以说&#xff0c;为什么要使用jupyterlab呢&#xff1f;当然是因为基于服务器来处理数据就可以使劲造了&#xff0c;而且深切地感觉到&#xff0c;“R这玩意儿是人用的吗”。 jupyter-lab | mamba安装以及…

【微信小程序】-- 全局配置 -- window - 导航栏(十五)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

Thymeleaf -- 视图模块

添加thymeleaf的jar包2. 新建一个Servlet类ViewBaseServletpublicclassViewBaseServletextendsHttpServlet { ​privateTemplateEnginetemplateEngine; ​Overridepublicvoidinit() throwsServletException { ​// 1.获取ServletContext对象ServletContextservletContextthis.g…

人大金仓和达梦的空间数据能力对比

一、总得来说&#xff1a; 人大金仓底层更解决于pg数据库&#xff0c; 人大金仓的空间能力基于postgis能力来实现&#xff0c;能力挺强大的. 细节上人大金仓的架构上也对空间的支持框架做的比达梦更加完善。例如数据库的集群能力&#xff0c;并行计算能力&#xff0c;空间数据…

使用热成像仪完成地暖检测应用

家庭地暖已逐步全面走进北方家庭中&#xff0c;常见的地暖系统分为两类&#xff0c;一类为电地暖&#xff0c;一类为水地暖&#xff0c;其常见问题为地暖发热不均&#xff0c;地暖不热或水暖管渗漏等问题。地暖系统在保障温暖及美观的同时&#xff0c;一直存在维修困难的问题&a…

最流行的自动化测试工具,总有一款适合你(附部分教程)

前言 在自动化测试领域&#xff0c;自动化工具的核心地位毋庸置疑。本文总结了最顶尖的自动化测试工具和框架&#xff0c;这些工具和框架可以帮助组织更好地定位自己&#xff0c;跟上软件测试的趋势。这份清单包含了开源和商业的自动化测试解决方案。 1&#xff09;Selenium …

第六章 图

文章目录前言知识框架数据结构的区分1. 图的基本概念1.1 图的定义1.2 图的基本概念和术语总结前言 参考文献&#xff1a;数据结构&#xff1a;图(Graph)【详解】 知识框架 数据结构的区分 线性表&#xff1a;数据元素之间是被串起来的&#xff0c;仅有线性关系&#xff0c;每…

Centos和Window系统下Frp内网穿透

frp 是一个高性能的内网穿透的反向代理软件&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等常见协议(TCP最常用)&#xff0c;可以将处于局域网或者家用电脑主机、办公电脑主机通过中转服务器的方式暴露在公网里&#xff0c;使用户可以通过访问公网的IP&#xff08;域名&#xff09;…

【数电基础】——触发器

目录 1.大纲 2.双稳态电路 3. SR锁存器&#xff08;或非门构成&#xff09; 4.SR锁存器&#xff08;与非门构成&#xff09; 5.门控SR锁存器&#xff08;与非门构成&#xff09; 6.触发器 1.D触发器 &#xff08;电平触发&#xff09; 2.D触发器&#xff08;上升沿触发&am…

腾讯会议演示者视图/演讲者视图

前言 使用腾讯会议共享PPT时&#xff0c;腾讯会议支持共享用户使用演示者视图/演讲者视图&#xff0c;而会议其他成员可以看到正常的放映视图。下面以Win10系统和Office为例&#xff0c;介绍使用步骤。值得一提的是&#xff0c;该方法同时适用于单显示屏和多显示屏。 腾讯会议…

详解JAVA注解

目录 1.基本注解 2.元注解 3.自定义注解 4.底层实现 1.基本注解 基本注解是JDK自带的一些单独使用的具有功能性的注解&#xff0c;包含以下四个&#xff1a; Override表示方法重写Deprecated表示方法过期&#xff0c;下个版本可能删除SuppressWarnings用于抑制告警SafeVa…

大学生创业有优势吗?创业方向应该如何选择?

大学生创业有优势吗&#xff1f; 目前&#xff0c;许多学校都有孵化器、创业基地等。大学生可以以极低的成本和成本在外面拥有相同质量的办公室和仓库&#xff0c;大学生的创业成本再次降低。 而且很多学校规定大学生可以无限期休学创业&#xff0c;这也消除了大学生创业失败…

深入分析Linux虚拟化KVM-Qemu之ioeventfd与irqfd

说明&#xff1a; KVM版本&#xff1a;5.9.1 QEMU版本&#xff1a;5.0.0 工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 ​ 图中的各个模块&#xff0c;只剩下通知机制没讲了&#xff0c;本文来一篇终结者&#xff1b; Guest与KVM及Qemu之间的通知机制&…

wordpress从宝塔升级到docker

15还是16年的时候买的阿里云和腾讯云最低配的1核1G。腾讯云和阿里云后来都涨价了&#xff0c;退了涨价多的那个腾讯云&#xff0c;阿里云一直续费到现在&#xff0c;wordpress这个最早的时候是用军哥的lnmp的一键包搭建的&#xff0c;后来改成用了带UI的宝塔&#xff0c;宝塔用…