训练营第三十三天贪心(第五部分重叠区间问题)

news2025/1/18 16:50:57

训练营第三十三天贪心(第五部分重叠区间问题)

435.无重叠区间

力扣题目链接

题目

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

示例 1:

输入: intervals = [[1,2],[2,3],[3,4],[1,3]]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

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

示例 3:

输入: intervals = [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

提示:

  • 1 <= intervals.length <= 105
  • intervals[i].length == 2
  • -5 * 104 <= starti < endi <= 5 * 104

解答

方法一:自己写的,比较慢

先根据第一个元素进行排序,如果第一个的右区间大于第二个的左区间就说明重叠,如果相等或者小于不算重叠,那么就要移除这两个区间中右边界更大的

局部最优:每次遇到重叠区间就移除右边界更大的

class Solution {
    public int eraseOverlapIntervals(int[][] intervals) {
		Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
		int count = 0;
		for (int i = 0; i < intervals.length - 1; i++) {
			if (intervals[i][1] > intervals[i + 1][0]){
				count++;
				intervals[i + 1][1] = Math.min(intervals[i][1],intervals[i + 1][1]);
			}
		}
		return count;
    }
}

763.划分字母区间

力扣题目链接

题目

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

示例 1:

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

示例 2:

输入:s = "eccbbbbdec"
输出:[10]

提示:

  • 1 <= s.length <= 500
  • s 仅由小写英文字母组成

解答

在这里插入图片描述

局部最优:当前的范围内能跳到的最远距离,即见上图,第一个元素能跳到8,那么遍历在0到8的范围内的元素能跳到的最大值,那么最终的终点就是当前分割出来的最长字符串

模拟过程

  1. a的最大索引为8,索引当前的end为8
  2. b的最大索引为5,小于当前的end,不变
  3. 依次类推,每次更新end,当end==i时,即达到位置8时,当前的切割字符串已经找到,记录并更新start索引为下一轮的起点
  4. 重复1、2、3步骤
class Solution {
    public List<Integer> partitionLabels(String s) {
		List<Integer> results = new ArrayList<>();//存放最后的结果
		int[] mapIndex = new int[26];//相当于map集合,对应26个英文字母的最终索引
        
		for (int i = 0; i < s.length(); i++) {//为每一个元素赋值最远索引
			mapIndex[s.charAt(i) - 'a'] = i;
		}
        
		int end = 0;//每一轮切割的结束索引
		int start = 0;//每一轮切割的第一个元素
		for (int i = 0; i < s.length(); i++) {
			end = Math.max(end,mapIndex[s.charAt(i) - 'a']);//如果大于当前的最大索引,那么就更新
			if (i == end){//如果达到了最终的最大索引,表示这一轮切割完成
				results.add(end - start + 1);
				start = i + 1;//更新下一轮的起点
			}
		}
		return results;
    }
}

56. 合并区间

力扣题目链接

题目

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

示例 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] 可被视为重叠区间。

提示:

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

解答

方法一:自己写的

局部最优:左侧最小,右侧最大

class Solution {
    public int[][] merge(int[][] intervals) {
		Arrays.sort(intervals,Comparator.comparingInt(a -> a[0]));
		for (int i = 0; i < intervals.length - 1; i++) {
			if (intervals[i][1] >= intervals[i + 1][0]){
				intervals[i + 1][0] = Math.min(intervals[i][0],intervals[i + 1][0]);
				intervals[i + 1][1] = Math.max(intervals[i][1],intervals[i + 1][1]);
				intervals[i] = null;//因为i + 1位置为合并后的,i位置已经没有用了
			}
		}
		
		List<int[]> result = new ArrayList<>();
		for (int[] interval : intervals) {
			if (interval != null)
				result.add(interval);
		}
		return result.toArray(new int[result.size()][]);
    }
}
方法二(并没有比方法一好)

直接通过移除链表的最后一个元素来达到方法一的目的

class Solution {
    public int[][] merge(int[][] intervals) {
        LinkedList<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
        res.add(intervals[0]);
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] <= res.getLast()[1]) {
                int start = res.getLast()[0];
                int end = Math.max(intervals[i][1], res.getLast()[1]);
                res.removeLast();
                res.add(new int[]{start, end});
            }
            else {
                res.add(intervals[i]);
            }         
        }
        return res.toArray(new int[res.size()][]);
    }
}

总结

遇到重叠区间的问题即二维数组的重叠区域等问题一定要先固定一头,然后在考虑另一头

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

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

相关文章

TapData + 实时数仓:实时数据如何赋能船舶制造业,助力数字化应用升级和科学管理运营

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速仓内数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c…

笔试狂刷--Day5(最小公倍数+最优路径)

大家好,我是LvZi,今天带来笔试狂刷--Day5 一.求最小公倍数 链接:求最小公倍数 分析: 数学知识–辗转相除法(迭代/递归) 代码: import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args)…

计算机视觉——两视图几何求解投影矩阵

上文我提到了通过图像匹配得到基本矩阵&#xff0c;接下来我们要接着求解投影矩阵。 计算投影矩阵思路 假设两个投影矩阵为规范化相机&#xff0c;因此采用基本矩阵进行恢复。在规范化相机下&#xff0c; P [ I ∣ 0 ] P[I|0] P[I∣0], P ′ [ M ∣ m ] P[M|m] P′[M∣m]。…

【结构型模型】享元模式

一、享元模式概述 享元模式定义&#xff1a;又叫蝇量模式&#xff0c;运用共享技术有效地支持大量细粒度对象的复用。系统只使用少量的对象&#xff0c;而这些对象都很相似&#xff0c;状态变化很小&#xff0c;可以实现对象的多次复用。由于享元模式要求能够共享的对象必须是细…

创建SpringBoot和RabbitMQ的整合项目

文章目录 创建SpringBoot和RabbitMQ的整合项目首先快速创建一个maven项目引入SpringBoot整合rabbitMQ的依赖在src/main目录下创建resources目录并引入配置文件写消息发送者MessageSender写消息接收者MessageReceiver写RabbitMQConfig配置类写SpringBoot启动主类CommandLineRunn…

Bootloader应用启动分析详解

内存->磁盘 引导程序->核心->根文件系统rootfs->app 引导程序加载最重要 由于boot设计比较偏底层,所以根据CPU架构和OS类型可能有所不同 uboot是对CPU架构和OS类型支持得比较多得一种开源引导程序 Bootloader的种类 s5p6818启动流程 芯片最开始是从iROM启动,…

【漏洞复现】泛微e-Mobile 移动管理平台文件上传漏洞

0x01 阅读须知 “如棠安全的技术文章仅供参考&#xff0c;此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供…

大型企业不同安全域文件交换,常见方式的优势与问题对比

现在越来越多的企业通过对网络进行物理或逻辑隔离&#xff0c;将内部网络与外部网络隔离开来&#xff0c;从而限制非法访问和恶意渗透&#xff0c;防止敏感数据泄露和恶意代码的传播&#xff0c;提高网络安全性。对于大型企业而言&#xff0c;将网络分为内外网并不足以满足安全…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 redis底层数据结构已完结&#x1f44f;&#x1f44f;&#x1f44f;&#xff1a; ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之Int…

UNet网络在图像去模糊方向的应用

前一段时间&#xff0c;我们学习了关于UNet网络的结构和基于UNet网络的去模糊网络MIMO-UNet&#xff0c;DeepRFT等网络的结构&#xff0c;大致的对网络的结构组成和实现过程有了一定的了解&#xff0c;下面考虑在图像去模糊部分&#xff0c;基于UNet的已有的研究工作&#xff0…

【力扣】螺旋矩阵

59. 螺旋矩阵 II 刚开始遇到这道题目的时候相信没见过的同学多多少少都会有点懵圈&#xff0c;感觉题目有点无从下手&#xff0c;但其实只要抓住本质就行了&#xff0c;题目的最终目的就是返回一个二维数组的结果&#xff0c;这个二维数组的大小是的 int[n][n]&#xff0c;题目…

Linux-线程互斥和死锁

目录 一.线程互斥 1.1 进程线程间的互斥相关背景概念 1.2 互斥量mutex 二.互斥量的接口 2.1 初始化互斥量 2.2 销毁互斥量 2.3 互斥量加锁和解锁 2.4 改进后售票代码 三.死锁 3.1.什么是死锁&#xff1f; 3.2.死锁四个必要条件 3.3 避免死锁 一.线程互斥 1.1 进程…

纳米尺度下的单粒子追踪,厦门大学方宁团队用 AI 奏响「细胞里的摇滚」

在微观世界里&#xff0c;每一个细胞都是一个繁忙的城市&#xff0c;而分子们则是这个城市中的居民。想象一下&#xff0c;如果我们能够追踪这些居民的每一个动作&#xff0c;或许便能够揭开生命奥秘的一角。这就是科学家们在活细胞中进行 3D 单粒子跟踪 (single particle trac…

Android MVVM架构 + Retrofit完成网络请求

关于Retrofit&#xff0c;这个应该不是一个很新颖的东西了&#xff0c;简单过一下吧 1.由Square公司开发&#xff0c;基于Type-safe的REST客户端。 2.使用注解来定义API接口&#xff0c;使得HTTP请求变得简洁且易于维护。 3.支持同步和异步请求&#xff0c;可与RxJava、Corouti…

模块三:二分——162.寻找峰值

文章目录 题目描述算法原理解法一&#xff1a;暴力查找解法二&#xff1a;二分查找 代码实现解法一&#xff1a;暴力查找解法二&#xff1a;CJava 题目描述 题目链接&#xff1a;162.寻找峰值 根据题意&#xff0c;需要使用O(log N)的时间复杂度来解决&#xff0c;得出本道题…

HTTP协议的总结

参考 https://www.runoob.com/http/http-tutorial.html 1.简介 HTTP&#xff08;超文本传输协议&#xff0c;Hypertext Transfer Protocol&#xff09;是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模…

javaWeb项目-邮票鉴赏系统功能介绍

项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff1a;Vue、ElementUI 关键技术&#xff1a;springboot、SSM、vue、MYSQL、MAVEN 数据库工具&#xff1a;Navicat、SQLyog 1、Java技术 Java 程…

《Linux运维实战:基于银河麒麟V10+鲲鹏920CPU部署DM8数据库主备集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;Linux运维实战总结 一、安装前准备 1.1、硬件环境 数据守护集群安装部署前需要额外注意网络环境和磁盘 IO 配置情况&#xff0c;其他环境配置项建…

大春资料分析刷题班

大春资料分析刷题班&#xff0c;以其独特的教学方法和丰富的实战经验&#xff0c;深受广大学员喜爱。课程中&#xff0c;大春老师不仅深入剖析资料分析题的解题技巧&#xff0c;还结合大量真题进行实战演练&#xff0c;让学员们在刷题中不断提升解题速度和准确率。同时&#xf…

DHCP Relay配置与抓包

前言&#xff1a;DHCP请求报文是以广播包方式发送的&#xff0c;当DHCP服务器与DHCP客户端不在同一网段时&#xff0c;就需要在三层网关设备配置DHCP中继功能 。 为能更好理解DHCP Relay功能&#xff0c;建议先看看DHCP Server的内容 https://blog.csdn.net/weixin_58574637…