【C++代码】区间重叠问题
题目:输入n个区间,给出每个区间的开始位置和结束位置(都是整数),求最多有多少个区间重叠?
该题目也可描述为给出每件事情的开始时间和结束时间(都为整数),求最多有多少个事件同时发生?以下的讲解以这种时间的概念讲解(感觉更容易理解一些)。
输入输出用例:第一行为事件个数,从第二行开始,每行为一个事件的开始时间和结束时间,中间用空格隔开。
5
1 4
1 2
2 3
3 4
3 5
方法一:
求最多有多少个事件同时发生,那我们可以依次把每个时刻(都是整数)发生了多少个事件求出来,找出最大值,即为答案。
如图,先求出t1时刻发生了多少事件,再求t2时刻发生了多少事件,再求t3时刻发生了多少事件,一直求到t4时刻发生了多少事件。
求某一时刻发生了多少事件,需要遍历所有事件,判断事件的起始时间start和结束时间end是否满足:start<=t<end,若满足,则t时刻发生的事件数+1。
时间复杂度度警告!!!这种方法时间复杂度非常高,一共有tmax个时刻,每个时刻遍历一遍所有事件判断该事件在当前时刻是否发生,O(tmax*n)的复杂度。
C++代码:
int main() {// 处理输入输出int n;cin >> n;vector<vector<int>> vec(n,vector<int> (2)); // 保存每个事件的起始时间和结束时间int max_en = 0; // 保存最大的时间for (int i = 0; i < n; ++i) { scanf("%d%d", &vec[i][0], &vec[i][1]); max_en = max(max_en, vec[i][1]);}// 求每一时刻发生了多少事件int res = 0;for (int i = 1; i <= max_en; ++i) {int cur = 0; // 保存时刻i发生的事件数量for (const auto &j : vec) {if (i >= j[0] && i < j[1]) {++cur; // 如果该事件的起始时间和结束时间包含该时刻i,则事件数+1}}res = max(res, cur); // 更新某时刻发生事件数量的最大值}cout << res;
}
方法二:
可以额外建一个长度为tmax的数组,数组的每个元素代表当前时刻发生的事件个数,数组元素全部初始化为0。然后只需要遍历一遍所有事件,每遍历到一个事件,就把数组的该事件的start到end部分元素值+1,表示这段时间又多了一个事件发生。最后数组元素的最大值,就是同时发生最多事件的数量。
时间复杂度警告!!!这种方法时间复杂度仍为O(n*tmax),但每个事件并不是从0~tmax都有值,而是只占了一小段时间,因此最优复杂度低一点,比上一种方法快一点。
C++代码:
int main() {// 处理输入输出int n;cin >> n;vector<vector<int>> vec(n, vector<int>(2)); // 保存每个事件的起始时间和结束时间int max_en = 0; // 保存最大的时间for (int i = 0; i < n; ++i) {scanf("%d%d", &vec[i][0], &vec[i][1]);max_en = max(max_en, vec[i][1]);}vector<int> v(max_en + 1, 0); // 额外建一个数组,保存每一时刻发生了多少事件for (const auto &j : vec) {for (int i = j[0]; i < j[1]; ++i) {++v[i];}}auto res = max_element(v.begin(), v.end());cout << *res;
}
方法三:
以上两种方法都比较好理解,但时间复杂度太高,还有别的方法,以后更新。
【C++代码】区间重叠问题相关推荐
- LeetCode 57. 插入区间(合并区间+排序)(区间重叠问题汇总)
题目描述 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: interval ...
- (python代码+讲解)重叠社区发现EAGLE层次算法的实现
EAGLE是一种基于最大团聚类的层次聚类算法,用来揭示网络的层次化和层次化社区结构.该算法采用一种聚类框架,来处理最大派系. 1.算法的实现: 首先用Bron-Kerbosch算法找到网络中的最大 ...
- java数字区间重叠校验
一. 设计背景 在具体的软件开发过程中可能会涉及到用两个数字表示一定的数字区间范围,或者是一个数字,另一个数字是无穷大或者是无穷小的数字区间范围.其实,总结起来共有8种类型的数字区间,它们是:1.左闭 ...
- leetcode435. 无重叠区间(贪心算法)
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触",但没有相互 ...
- 【LeetCode刷题】重叠区间问题
跟着甜姨整理了这一类问题,没有固定套路,但需要找规律以及细心. 重叠区间 252,会议室,easy 题解 实质是判断有没有重叠区间,将区间按照会议开始时间排序,然后遍历一遍即可. 代码 class S ...
- LeetCode435—无重叠区间(java版)
题目描述: 标签:贪心算法 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互&qu ...
- 判断多个时间(数值)区间段是否出现重叠(时间工具类)
一.工具类代码: package com.sszh.util.date;import java.math.BigDecimal; import java.text.SimpleDateFormat; ...
- 动态规划-重叠区间2020.3.30
1.水 贪心算法 || 区间重叠问题 2.水重叠区间问题 3.水 算法练习:重叠区间个数 4.真·贪心,但只知其用,不知其理 leetCode435 5.详细贪心Leetcode 435:无重叠区间( ...
- 简单区间问题 选择不相交区间 区间选点 区间覆盖问题解答及代码 C++
1. 选择不相交区间 数轴上有n个开区间 ( a i , b i ) (a_i, b_i) (ai,bi).选择尽量多个区间,使得这些区间没有公共点. 这是最简单的区间问题,很多区间问题都需要先排 ...
最新文章
- 调试反馈的一种实时反馈方法
- php设计模式中的类型安全 指--只接受特定的对象 ---以避免发生错误
- 浅谈对xmpp的理解及应用
- 浅谈WebKit之Port
- leetcode 6 --- convertZ
- [HTTP] 跨域资源共享
- mfc对话框ok没效果_摄影色调效果(冷色调与暧色调)
- 让PHP查询mysql时不区分大小写
- IntelliJ IDEA 优化总结 适用于clion
- Installing SuiteSparse
- python判断_Python中判断一个字符串是否以特定字符前缀开始的函数:startswith()
- 项目设计----会员充值(基础)
- sqlplus 命令导入数据文件
- ANC 调试 -FF 降噪原理和调试
- 形容词和指示代词-this、that、thses、those_31
- Linux文件与管理(还是多记)
- 用Xbox360游戏手柄通过python代码控制树莓派4B点亮LED灯
- 电路设计_STM8S003F3P6 AWUADC使用小结
- (Nips-2015)空间变换器网络
- 2017双11技术揭秘—双十一海量数据下EagleEye的使命和挑战