一、基础算法9:区间合并 模板题+算法模板(区间合并)

这篇具有很好参考价值的文章主要介绍了一、基础算法9:区间合并 模板题+算法模板(区间合并)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法模板

离散化题目模板

// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
{
    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);

    if (st != -2e9) res.push_back({st, ed});

    segs = res;
}

模板题

区间和

原题链接

https://www.acwing.com/problem/content/805/

题目

803 . 区间合并
给定 n
个区间 [li,ri]
,要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3]
和 [2,6]
可以合并为一个区间 [1,6]

输入格式
第一行包含整数 n

接下来 n
行,每行包含两个整数 l
和 r

输出格式
共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围
1≤n≤100000
,
−109≤li≤ri≤109
输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

题解

#include <iostream>
#include <vector> 
#include <algorithm>
using namespace std;

const int N = 1e5 + 10;

typedef pair<int,int> PII;

vector<PII> segs;

int n,l,r;

vector<PII> merge(vector<PII> segs){
	vector<PII> res;
	sort(segs.begin(),segs.end());
	
	int st = -2e9, ed = -2e9;
	
	for(auto seg : segs){
		if(seg.first>ed){
			if (st != -2e9) res.push_back({st,ed});
			st = seg.first;
			ed = seg.second;
		}
		else{
//			ed = max(ed,seg.second);
			if(seg.second > ed){
				ed = seg.second;
			}
		}
	}
	if(st != -2e9) res.push_back({st,ed}); // 注意最后还要把最后一轮合并好的st,ed加进结果数组 
	
	return res; 
}
int main(){
	cin>>n;
	
	for(int i=0;i<n;i++){
		cin>>l>>r;
		segs.push_back({l,r});
	}
	
	vector<PII> res = merge(segs);

	cout<< res.size() <<endl;
	
	return 0; 
}

思路

一、基础算法9:区间合并 模板题+算法模板(区间合并)
按区间左端点排序,从左开始遍历
有三种情况:设当前区间左右端点为(st,ed)
① 新的区间st<st1<ed,ed1<ed,即在当前区间内,此时不用更新;
②新的区间st<st2<ed,ed2>ed,此时需要更新右端点,即ed = ed2;
③新的区间st3>ed,此时需要维护一个新的区间,将前面合并好的(st,ed)区间加入到结果vector中,然后st = st3,ed = ed3,维护该区间向后进行遍历;文章来源地址https://www.toymoban.com/news/detail-443610.html

到了这里,关于一、基础算法9:区间合并 模板题+算法模板(区间合并)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法详解】力扣56.合并区间

    力扣链接:力扣56.合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [start, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入: intervals = [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,1

    2024年01月19日
    浏览(35)
  • 【贪心算法part05】| 435.无重叠区间、763.划分字母区间、56.合并区间

    目录 🎈LeetCode435. 无重叠区间   🎈LeetCode763.划分字母区间 🎈LeetCode 56.合并区间 链接:435.无重叠区间 给定一个区间的集合  intervals  ,其中  intervals[i] = [starti, endi]  。返回  需要移除区间的最小数量,使剩余区间互不重叠  。    链接:763.划分字母区间 给你一个字符串

    2024年02月16日
    浏览(51)
  • Leecode56:合并区间(贪心算法)

    第一眼看到这个题目觉得应该是比较第一个值的大小,因为如果第n个值比n-1个值的右边还小于等于,那么说明区间可以连起来。但是不会写比较强!! Arrays.sort()函数里, Arrays.sort(shuzu, Comparatorint[](){ }); 千万记得排序后分清楚哪个是原本的哪个是当前的!!以及新加一个

    2024年02月07日
    浏览(46)
  • 贪心算法part5 | ● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

    重叠问题都需要先排好序,再贪心 搞清楚左右区间,重叠的条件。 要找出最少删除的数量,也就是找出重叠空间的数量,然后用长度减去即可。 这里提供一种与452.用最少数量的箭引爆气球 (opens new window)、435.无重叠区间 (opens new window)相同的思路。 统计字符串中所有字符的

    2024年02月09日
    浏览(64)
  • 【算法之贪心算法IV】leetcode56. 合并区间

    力扣题目链接 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中 points[i] = [xstart, xend] 表示水平直径在 xstart 和 xend 之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭

    2024年02月11日
    浏览(57)
  • 算法训练day36|贪心算法 part05(重叠区间三连击:LeetCode435. 无重叠区间763.划分字母区间56. 合并区间)

    题目链接🔥🔥 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1: 输入: [ [1,2], [2,3], [3,4], [1,3] ] 输出: 1 解释: 移除 [1,3] 后,剩下的区

    2024年02月09日
    浏览(62)
  • Day 36 贪心算法 part05 : 435. 无重叠区间 763.划分字母区间 56. 合并区间

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

    2024年02月09日
    浏览(53)
  • 【LeetCode题目详解】第八章 贪心算法 part05 435. 无重叠区间 763.划分字母区间 56. 合并区间 (day36补)

    给定一个区间的集合  intervals  ,其中 intervals[i] = [starti, endi]  。返回 需要移除区间的最小数量,使剩余区间互不重叠  。 示例 1: 示例 2: 示例 3: 提示: 1 = intervals.length = 105 intervals[i].length == 2 -5 * 104 = starti  endi = 5 * 104 相信很多同学看到这道题目都冥冥之中感觉要排序,但

    2024年02月11日
    浏览(51)
  • 256.【华为OD机试真题】会议室占用时间(区间合并算法-Java&Python&C++&JS实现)

    🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(JavaPythonC++JS分别实现),详细代码讲解,助你深入学习,深度掌握!

    2024年02月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包