(新卷,200分)- 区间交叠问题(Java JS Python)

(新卷,200分)- 区间交叠问题(Java & JS & Python)

题目描述

给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖柱所有线段。

输入描述

第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为"x,y",x和y分别表示起点和终点,取值范围是[-10^5,10^5]。

输出描述

最少线段数量,为正整数

用例
输入

3
1,4
2,5
3,6

输出2
说明
题目解析

用例1图示如下

可以发现,只要选择[]1,4[和[3,6]就可以覆盖住所有给定线段。

我的解题思路如下:

首先,将所有区间ranges按照开始位置升序。

然后,创建一个辅助的栈stack,初始时将排序后的第一个区间压入栈中。

然后,遍历出1~ranges.length范围内的每一个区间ranges[i],将遍历到ranges[i]和stack栈顶区间对比:

  • 如果stack栈顶区间可以包含ranges[i]区间,则range[i]不压入栈顶
  • 如果stack栈顶区间被ranges[i]区间包含,则弹出stack栈顶元素,继续比较ranges[i]和stack新的栈顶元素
  • 如果stack栈顶区间和ranges[i]无法互相包含,只有部分交集,则将ranges[i]区间去除交集部分后,剩余部分区间压入stack
  • 如果stack栈顶区间和ranges[i]区间没有交集,那么直接将ranges[i]压入栈顶

这样的话,最终stack中有多少个区间,就代表至少需要多少个区间才能覆盖所有线段。

比如,用例1的运行流程如下:

2,5 和 1,4 存在重叠区间,我们只保留2,5区间的非重叠部分4,5

比较4,5区间和3,6区间,发现3,6完全涵盖2,5,因此2,5区间不再需要,可以从stack中弹栈删掉,即原始的2,5区间被删除了。

继续比较1,4和3,6区间,发现无法互相涵盖,因此都需要保留,但是3,6有部分区间和1,4重叠,因此只保留3,6不重叠部分4,6。

最终只需要两个区间,对应1,4、3,6,即可涵盖所有线段

自测用例:

8
0,4
1,2
1,4
3,7
6,8
10,12
11,13
12,14

输出5,即至少需要上面标红的五个区间才能覆盖所有线段。


2023.01.27

根据网友指正,上面逻辑缺失一个场景,比如:

3

1,10

5,12

8,11

按找前面逻辑,首先对所有区间按开始位置升序,然后将1,10入栈

然后尝试将5,12入栈,发现和栈顶区间有交集,因此去除交集部分后,5,12变为10,12,入栈

然后尝试将8,11入栈,但是此时出现一个尴尬的情况,那就是栈顶区间10,12不能完全包含8,11,因此8,11区间还需要和栈顶前一个区间1,10继续比较,这就背离了我们一开始将所有区间按开始位置升序的初衷了。。。

而导致这个问题的根本原因是,栈顶区间10,12是被裁剪过的,因此导致它的起始位置落后了,即可能无法包含住升序后下一个区间的起始位置了,但是转念一想,先入栈的区间的起始位置肯定是要小于等于后入栈的区间的,因此栈顶区间被裁剪,说明栈顶区间和前一个区间必然是严密结合的,因此8,11的起始位置超出了栈顶区间,其实还是会被栈顶前一个区间包含进去。因此这里8,11不入栈。

JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */ const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); const lines = []; let n; rl.on("line", (line) => { lines.push(line); if (lines.length === 1) { n = lines[0] - 0; } if (n && lines.length === n + 1) { lines.shift(); const ranges = lines.map((line) => line.split(",").map(Number)); console.log(getResult(ranges, n)); lines.length = 0; } }); function getResult(ranges, n) { ranges.sort((a, b) => a[0] - b[0]); const stack = [ranges[0]]; for (let i = 1; i < ranges.length; i++) { const range = ranges[i]; while (true) { if (stack.length == 0) { stack.push(range); break; } const [s0, e0] = stack.at(-1); const [s1, e1] = range; if (s1 <= s0) { if (e1 <= s0) { break; } else if (e1 < e0) { break; } else { stack.pop(); } } else if (s1 < e0) { if (e1 <= e0) { break; } else { stack.push([e0, e1]); break; } } else { stack.push(range); break; } } } //console.log(stack); return stack.length; }
Java算法源码
import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); Integer[][] ranges = new Integer[n][]; for (int i = 0; i < n; i++) { ranges[i] = Arrays.stream(sc.nextLine().split(",")).map(Integer::parseInt).toArray(Integer[]::new); } System.out.println(getResult(ranges)); } public static int getResult(Integer[][] ranges) { Arrays.sort(ranges, (a, b) -> a[0] - b[0]); LinkedList<Integer[]> stack = new LinkedList<>(); stack.add(ranges[0]); for (int i = 1; i < ranges.length; i++) { Integer[] range = ranges[i]; while (true) { if (stack.size() == 0) { stack.add(range); break; } Integer[] top = stack.getLast(); int s0 = top[0]; int e0 = top[1]; int s1 = range[0]; int e1 = range[1]; if (s1 <= s0) { if (e1 <= s0) { break; } else if (e1 < e0) { break; } else { stack.removeLast(); } } else if (s1 < e0) { if (e1 <= e0) { break; } else { stack.add(new Integer[] {e0, e1}); break; } } else { stack.add(range); break; } } } return stack.size(); } }
Python算法源码
# 输入获取 n = int(input()) rans = [list(map(int, input().split(","))) for i in range(n)] # 算法入口 def getResult(rans, n): rans.sort(key=lambda x: x[0]) stack = [rans[0]] for i in range(1, n): ran = rans[i] while True: if len(stack) == 0: stack.append(ran) break s0, e0 = stack[-1] s1, e1 = ran if s1 <= s0: if e1 <= s0: break elif e1 < e0: break else: stack.pop() elif s1 < e0: if e1 <= e0: break else: stack.append([e0, e1]) break else: stack.append(ran) break return len(stack) # 算法调用 print(getResult(rans, n))

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

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

相关文章

(新卷,200分)- 区块链文件转储系统(Java JS Python)

(新卷,200分)- 区块链文件转储系统&#xff08;Java & JS & Python&#xff09; 题目描述 区块链底层存储是一个链式文件系统&#xff0c;由顺序的N个文件组成&#xff0c;每个文件的大小不一&#xff0c;依次为F1,F2,...,Fn。随着时间的推移&#xff0c;所占存储会越…

JVM(Java虚拟机) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

(新卷,200分)- 任务调度(Java JS Python)

(新卷,200分)- 任务调度&#xff08;Java & JS & Python&#xff09;题目描述现有一个CPU和一些任务需要处理&#xff0c;已提前获知每个任务的任务ID、优先级、所需执行时间和到达时间。 CPU同时只能运行一个任务&#xff0c;请编写一个任务调度程序&#xff0c;采用“…

全网最全9个AI论文软件,本科生毕业论文必备!

全网最全9个AI论文软件&#xff0c;本科生毕业论文必备&#xff01; AI 工具如何成为论文写作的得力助手 随着人工智能技术的不断进步&#xff0c;AI 工具在学术写作中的应用越来越广泛。对于本科生而言&#xff0c;撰写毕业论文是一项既重要又充满挑战的任务。而 AI 工具的出现…

(新卷,200分)- 上班之路(Java JS Python)

(新卷,200分)- 上班之路&#xff08;Java & JS & Python&#xff09;题目描述Jungle 生活在美丽的蓝鲸城&#xff0c;大马路都是方方正正&#xff0c;但是每天马路的封闭情况都不一样。 地图由以下元素组成&#xff1a; 1&#xff09;”.” — 空地&#xff0c;可以达到…

【课程设计/毕业设计】基于springboot的小区蔬菜水果商城系统蔬菜超市系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java计算机毕设之基于Springboot的生鲜超市管理系统基于springboot的蔬菜超市系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

day166—递归—多边形三角剖分的最低得分(LeetCode-1039)

题目描述你有一个凸的 n 边形&#xff0c;其每个顶点都有一个整数值。给定一个整数数组 values &#xff0c;其中 values[i] 是按 顺时针顺序 第 i 个顶点的值。假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形&#xff0c;该三角形的值是顶点标记的乘积&#xff0c;三角…

(新卷,200分)- 数字加减游戏(Java JS Python)

(新卷,200分)- 数字加减游戏&#xff08;Java & JS & Python&#xff09; 题目描述 小明在玩一个数字加减游戏&#xff0c;只使用加法或者减法&#xff0c;将一个数字s变成数字t。 每个回合&#xff0c;小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以…

ThinkPHP框架学习全攻略

好的&#xff0c;学习 ThinkPHP&#xff08;TP&#xff09;框架可以遵循以下系统化的路线&#xff1a; 1. 基础准备 环境搭建&#xff1a;安装 PHP&#xff08;建议 7.4&#xff09;、MySQL/MariaDB、Composer&#xff08;依赖管理工具&#xff09;。框架安装&#xff1a;通过…

Java毕设选题推荐:基于SpringBoot生鲜商城系统基于springboot的蔬菜超市系统【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Java毕设项目:基于springboot的蔬菜超市系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

(新卷,200分)- 探索地块建立(Java JS Python)

(新卷,200分)- 探索地块建立&#xff08;Java & JS & Python&#xff09; 题目描述 给一块n*m的地块&#xff0c;相当于n*m的二维数组&#xff0c;每个元素的值表示这个小地块的发电量&#xff1b; 求在这块地上建立正方形的边长为c的发电站&#xff0c;发电量满足目…

Nacos CVE-2021-29442

CVE-2021-29442 是 Nacos 中一个认证绕过 远程代码执行&#xff08;RCE&#xff09; 的高危漏洞&#xff0c;主要影响 Nacos 1.4.1 及以下版本&#xff0c;漏洞的核心原因是&#xff1a; Nacos 默认的鉴权实现存在逻辑缺陷&#xff0c;攻击者可以通过构造特殊的 HTTP 请求头绕…

(新卷,200分)- 去除多余空格(Java JS Python)

(新卷,200分)- 去除多余空格&#xff08;Java & JS & Python&#xff09;题目描述去除文本多余空格&#xff0c;但不去除配对单引号之间的多余空格。给出关键词的起始和结束下标&#xff0c;去除多余空格后刷新关键词的起始和结束下标。条件约束&#xff1a; 1&#xf…

IP地址与端口号

IP地址及编址方式 IP地址基础概念 IP地址的本质 定义&#xff1a;用于唯一标识互联网上设备的逻辑地址结构&#xff1a;采用两级结构&#xff08;网络号 主机号&#xff09;唯一性&#xff1a;在整个互联网范围内是唯一的表示方法&#xff1a;点分十进制记法&#xff08;如…

制造业七大核心系统盘点——ERP、MES、WMS、SCM、PLM、SCADA、QMS

我这几年跑工厂、聊老板、跟信息化负责人沟通&#xff0c;听到最多的一句话不是我们没系统&#xff0c;而是&#xff1a;ERP 上了&#xff0c;车间还是一团乱MES 买了&#xff0c;数据没人信仓库有系统&#xff0c;库存还是对不上系统一堆&#xff0c;但问题一个没少这时候很多…

python之lession7-迭代器和生成器

案例一&#xff1a;迭代器访问 import syslist[1,2,3,4] it iter(list) while True:try:print(next(it))except StopIteration:sys.exit()案例二&#xff1a;使用class类创建一个迭代器 class MyNumbers:def __iter__(self):self.a 1return selfdef __next__(self):x self.a…

【毕业设计】基于springboot的蔬菜超市系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

DuCsps.dll文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况&#xff0c;由于很多常用软件都是采用 Microsoft Visual Studio 编写的&#xff0c;所以这类软件的运行需要依赖微软Visual C运行库&#xff0c;比如像 QQ、迅雷、Adobe 软件等等&#xff0c;如果没有安装VC运行库或者安装…