当前位置: 首页 > news >正文

代码随想录算法训练营第三六天 | 无重叠区间、划分字母区间、合并区间

目录

  • 无重叠区间
  • 划分字母区间
  • 合并区间

LeetCode 435. 无重叠区间
LeetCode 763.划分字母区间
LeetCode 56. 合并区间

无重叠区间

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

和用最少数量的箭引爆气球很像,唯一的区别是引爆气球记录的是非重叠数量, 本题记录的是重叠数量。 在 if else 内操作会有所不同。

另外,本题对左区间和右区间均可排序,可以计算非重叠数量,用总数量减去非重叠得到重叠数量,也可以按下面代码直接计算重叠数量。

class Solution {// [1,2],[2,3],[3,4],[1,3]// [1,2],[1,3],[2,3],[3,4]  => [1,2],[1,2],[2,3],[3,4]// 1 < 2 重叠 记录删除 result++// 重叠记录最小右区间 // 直到遍历完数组public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals, (a, b) -> {if (a[0] == b[0]) return a[1] - b[1];return a[0] - b[0];});int result = 0;for (int i = 1; i < intervals.length; i++) {if (intervals[i][0] < intervals[i - 1][1]) {  // 重叠步骤intervals[i][1] = Math.min(intervals[i][1], intervals[i - 1][1]); result++;   } }return result;}
}

划分字母区间

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

题目要求同一字母最多出现在一个片段中。

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

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点
class Solution {public List<Integer> partitionLabels(String s) {List<Integer> result = new ArrayList<>();int[] hash = new int[26];for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);hash[c - 'a'] = i;}// s -> [8, 5, 8, ... ]int idx = 0;int last = -1;for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);idx = Math.max(idx, hash[c - 'a']);if (i == idx) {result.add(i - last);last = i;}}return result;}
}
class Solution {public int[][] findPartitions(String s) {// "ababcbacadefegdehijhklij"List<Integer> temp = new ArrayList<>();int[][] hash = new int[26][2]; // 26 个字母 2 列 表示该字母对应的区间// 哈希数组// [[0,8], [1,5], [4,7], [9,14], [10, 15] ...]for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);if (hash[c - 'a'][0] == 0) hash[c - 'a'][0] = i;hash[c - 'a'][1] = i;hash[s.charAt(0) - 'a'][0] = 0; }List<List<Integer>> h = new LinkedList<>();// 去除字符串中未出现的字母所占用区间// 组装区间到集合for (int i = 0; i < 26; i++) {// if (hash[i][0] != hash[i][1]) {temp.clear();temp.add(hash[i][0]);temp.add(hash[i][1]);h.add(new ArrayList<>(temp));// }}// 存入数组int[][] res = new int[h.size()][2];for (int i = 0; i < h.size(); i++) {List<Integer> list = h.get(i);res[i][0] = list.get(0);res[i][1] = list.get(1);}return res;}public List<Integer> partitionLabels(String s) {int[][] partitions = findPartitions(s);List<Integer> result = new ArrayList<>();// [[0,8], [1,5], [4,7], [9,14], [10, 15] ...]Arrays.sort(partitions, (o1, o2) -> Integer.compare(o1[0], o2[0]));int right = partitions[0][1];int left = 0;for (int i = 0; i < partitions.length; i++) {if (partitions[i][0] > right) { // 一旦下一区间左边界大于当前右边界,即可认为出现分割点result.add(right - left + 1);left = partitions[i][0];}right = Math.max(right, partitions[i][1]);}result.add(right - left + 1);return result;}
}

合并区间

这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。

所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

在这里插入图片描述

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

相关文章:

代码随想录算法训练营第三六天 | 无重叠区间、划分字母区间、合并区间

目录 无重叠区间划分字母区间合并区间 LeetCode 435. 无重叠区间 LeetCode 763.划分字母区间 LeetCode 56. 合并区间 无重叠区间 给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠…...

DP读书:《openEuler操作系统》(十)套接字 Socket 数据传输的基本模型

10min速通Socket 套接字简介数据传输基本模型1.TCP/IP模型2.UDP模型 套接字类型套接字&#xff08;Socket&#xff09;编程Socket 的连接1.连接概述(1)基本概念(2)连接状态(3)连接队列 2.建立连接3.关闭连接 socket 编程接口介绍数据的传输1. 阻塞与非阻塞2. I/O复用 数据的传输…...

抓住母亲节销售机会:Shopee 平台选品策略大揭秘

母亲节&#xff0c;作为一个重要的购物节日&#xff0c;为卖家带来了巨大的销售机会。在Shopee这样的电商平台上&#xff0c;如何通过有效的选品策略吸引消费者、提高销量呢&#xff1f;下面将介绍一些关键策略&#xff0c;帮助卖家在母亲节期间实现销售突破。 先给大家推荐一…...

Mysql如何优化数据查询方案

mysql做读写分离 读写分离是提高mysql并发的首选方案。 Mysql主从复制的原理 mysql的主从复制依赖于binlog&#xff0c;也就是记录mysql上的所有变化并以二进制的形式保存在磁盘上&#xff0c;复制的过程就是将binlog中的数据从主库传输到从库上。 主从复制过程详细分为3个阶段…...

SwiftUI 更自然地向自定义视图传递参数的“另类”方式

概览 在 SwiftUI 中&#xff0c;正是自定义视图让我们的 App 变得与众不同&#xff01;然而&#xff0c;除了传统的视图接口定义方式以外&#xff0c;我们其实还可以有更“银杏化”的选择。 如上图所示&#xff1a;对于 SubView 子视图所需的参数我们一开始并没有操之过急&…...

Word第一课

文章目录 1. 文件格式1.1 如何显示文件扩展名1.2 Word文档格式的演变1.3 常见的Word文档格式 3. 文档属性理解文档属性查看文档属性 1. 文件格式 1.1 如何显示文件扩展名 文档格式指的是文件的扩展名&#xff0c;例如下图 对于该文件&#xff0c;.docx就是文件扩展名&#x…...

【Vue3】路由传参的几种方式

路由导航有两种方式&#xff0c;分别是&#xff1a;声明式导航 和 编程式导航 参数分为query参数和params参数两种 声明式导航 query参数 一、路径字符串拼接(不推荐) 1.传参 在路由路径后直接拼接?参数名:参数值 &#xff0c;多组参数间使用&分隔。 <RouterLink …...

突破编程_C++_面试(高级特性(1))

面试题1&#xff1a;什么是线程以及它在并发编程中的作用是什么 线程&#xff08; Thread &#xff09;是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进…...

django请求生命周期流程图,路由匹配,路由有名无名反向解析,路由分发,名称空间

django请求生命周期流程图 浏览器发起请求。 先经过网关接口&#xff0c;Django自带的是wsgiref&#xff0c;请求来的时候解析封装&#xff0c;响应走的时候打包处理&#xff0c;这个wsgiref模块本身能够支持的并发量很少&#xff0c;最多1000左右&#xff0c;上线之后会换成u…...

@ 代码随想录算法训练营第8周(C语言)|Day54(动态规划)

代码随想录算法训练营第8周&#xff08;C语言&#xff09;|Day54&#xff08;动态规划&#xff09; Day53、动态规划&#xff08;包含题目 ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV &#xff09; 123.买卖股票的最佳时机III 题目描述 给定一个数组&#…...

Flask 学习100-Flask-SocketIO 结合 xterm.js 实现网页版Xshell

前言 xterm.js 是一个使用 TypeScript 编写的前端终端组件,可以直接在浏览器中实现一个命令行终端应用。 可以实现 web-terminal 功能,类似于Xshell 操作服务器。 Flask-SocketIO 快速入门与使用基础参考前面这篇https://www.cnblogs.com/yoyoketang/p/18022139 前后端交互…...

Springboot AOP开发

Springboot AOP开发 一 AOP概述 AOP&#xff0c;即面向切面编程&#xff0c;简言之&#xff0c;面向方法编程。 针对方法&#xff0c;在方法的执行前或执行后使用&#xff0c;用于增强方法&#xff0c;或拓展。 二 AOP开发 1.引入 spring-boot-starter-aop 在SpringBoot项…...

office的excel中使用,告诉我详细的解决方案,如何变成转化为金额格式

在Office的Excel中&#xff0c;如果你想将名为"MEREFIELD"的公式结果转换为金额格式&#xff0c;你可以遵循以下详细步骤来实现&#xff1a; 书写MEREFIELD公式&#xff1a; 首先&#xff0c;在Excel中输入或确认你的MEREFIELD公式。例如&#xff0c;假设这个公式是用…...

灾后重建中GIS技术的关键作用与案例分析

地质灾害是指全球地壳自然地质演化过程中&#xff0c;由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下&#xff0c;地质灾害在世界范围内频繁发生。我国除滑坡灾害外&#xff0c;还包括崩塌、泥石流、地面沉…...

java环境安装

java环境安装 一、官网下载&#xff1a; jdk&#xff0c;下载jdk&#xff0c;解压到D:\JAVA\Java\jdk目录下。 二、配置&#xff1a; 配置环境变量 鼠标右键我的电脑->属性->高级系统设置->环境变量->系统变量新建变量名JAVA_HOME&#xff0c;变量值为刚才解压的…...

如何在iStoreOS软路由系统中安装cpolar实现公网远程本地电脑桌面

文章目录 简介一、配置远程桌面公网地址二、家中使用永久固定地址 访问公司电脑**具体操作方法是&#xff1a;** 简介 软路由是PC的硬件加上路由系统来实现路由器的功能&#xff0c;也可以说是使用软件达成路由功能的路由器。 使用软路由控制局域网内计算机的好处&#xff1a…...

appium实现自动化测试原理

目录 1、Appium原理 1.1、Android Appium原理图文解析 1.1.2、原理详解 1.1.2.1、脚本端 1.1.2.2、appium-server 1.1.2.3、中间件bootstrap.jar 1.1.2.4、驱动引擎uiautomator 1.2、 IOS Appium原理 1、Appium原理 1.1、Android Appium原理图文解析 执行测试脚本全过…...

Linux:docker搭建redis集群(3主3从扩容缩容 哈希槽分配)

操作系统&#xff1a;centos7 docker-ce版本&#xff1a;24.0.7 1.准备redis镜像 我这里使用redis 6.0.8 镜像进行操作&#xff0c;如果你也需要镜像&#xff0c;在网络正常情况下直接使用 docker pull redis:6.0.8 即可进行下载&#xff0c;如果你没配置国内加速器&#x…...

Linux程序性能分析60秒+

Linux性能分析大师Brendan Gregg有一篇非常著名的博客&#xff0c;介绍在性能分析开始的60秒内&#xff0c;利用标准的Linux命令行工具&#xff0c;执行一次充分的性能检查&#xff0c;获得系统资源利用率和进程运行情况的整体概念&#xff0c;查看是否存在异常、评估饱和度。本…...

mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景&#xff0c;其中一个典型的应用场景是网络文件传输。 假设我们需要将一个大文件传输到远程服务器上。在传统的方式下&#xff0c;我们可能需要将文件内容读入内存&#xff0c;然后再将数据从内存复制到网络协议栈中&#xff0c;最终发送到远…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版&#xff0c;柱状图PPT模版&#xff0c;线状图PPT模版&#xff0c;折线图PPT模版&#xff0c;饼状图PPT模版&#xff0c;雷达图PPT模版&#xff0c;树状图PPT模版 图表类系列各种样式PPT模版分享&#xff1a;图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...