基础算法-区间合并

简介: 一、区间合并区间合并,是指将若干个 有交集 的区间合并为 1 个区间。关于区间的写法,我们可以用结构体进行实现,其中既包括左节点,也包括右节点。

一、区间合并

  • 区间合并,是指将若干个 有交集 的区间合并为 1 个区间。关于区间的写法,我们可以用结构体进行实现,其中既包括左节点,也包括右节点。
struct Interval
{
    int left;
    int right;
};
  • 区间合并本身并不复杂,也好理解,因此在此不过多叙述了。



二、区间合并例题——区间和并

题目描述


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

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

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

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


输入格式

第一行包含整数 n。

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


输出格式

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

数据范围

1 ≤ n ≤ 100000 ,

−1e9 ≤ li ≤ ri ≤ 1e9


输入样例

5

1 2

2 4

5 6

7 8

7 9

输出样例

3


具体实现

1. 样例演示

0b6f073be6104d378a307ab2600b8cbd.png


2. 实现思路

  • (1) 按区间的左端点进行排序。
  • (2) 扫描每个区间,将每个可能有交集的区间进行合并。有如下图三种可能:


38646f75fe304507a82defc32e93a99b.png


颜色 情况 更新方法
绿色 包含 原区间端点不变
黄色 相交 左端点不变,右端点延长
粉色 没有交集 从当前区间开始,后面的所有区间与原区间没有交集,便可将原区间放入答案当中,左右端点更新为粉色区间



3. 代码注解

if (st != -2e9) res.push_back({st, ed}); 的作用:是防止n为0,把 [-无穷,-无穷] 压入和压入最后一个(也就是当前)的区间,若 n>=1,if 可以不要。


4. 实现代码

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
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;
}
int main()
{
    int n;
    cin>>n;
    vector<PII> segs;
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        cin>>l>>r;
        segs.push_back({l, r});
    }
    merge(segs);
    cout << segs.size() << endl;
    system("pause");
    return 0;
}

























         
相关文章
|
4月前
|
算法 测试技术 C#
C++二分查找算法:包含每个查询的最小区间
C++二分查找算法:包含每个查询的最小区间
|
4月前
|
人工智能 算法 BI
class077 区间dp-下【算法】
class077 区间dp-下【算法】
43 0
|
4月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-1 算法训练 区间k大数查询
30 0
|
10月前
|
存储 算法 C++
C++基础算法离散化及区间合并篇
C++基础算法离散化及区间合并篇
113 0
|
3月前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
3月前
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
3月前
|
算法
基于仿射区间的分布式三相不对称配电网潮流算法matlab仿真
```markdown # 摘要 本课题聚焦于基于仿射区间的分布式三相配电网潮流算法在MATLAB2022a中的仿真。算法利用仿射运算处理三相不平衡情况及分布式电源注入,旨在提供比区间算法更精确的不确定区域。仿真结果展示了算法优势。核心程序设计考虑了PQ、PV及PI节点,将不同类型的节点转换统一处理,以适应含分布式电源的配电网潮流计算需求。 ``` 这个摘要以Markdown格式呈现,总字符数为233,满足了240字符以内的要求。
|
4月前
|
算法 C++
c++算法学习笔记 (12) 区间合并
c++算法学习笔记 (12) 区间合并
|
4月前
|
存储 机器学习/深度学习 人工智能
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
【算法基础】基础算法(三)--(双指针算法、位运算、离散化、区间合并)
|
4月前
|
人工智能 算法
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)
前缀和算法题(区间次方和、小蓝平衡和、大石头的搬运工、最大数组和)