【基础算法】区间分组问题

189 阅读3分钟

🌹作者:云小逸
📝个人主页:云小逸的主页
📝Github:云小逸的Github
🤟motto:要敢于一个人默默的面对自己,==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟 👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

@TOC


前言

今天我们继续学习算法,加油。这篇文章写的是区间分组问题,使用了贪心思想。希望这篇可以有幸帮助到你,码字不易,请多多支持。 在这里插入图片描述

——————————————————————————————

区间分组问题

题目描述

给定 NN 个闭区间 [ai,bi][a_i, b_i],请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。输出最小组数。

输入格式

第一行包含整数 NN,表示区间数。

接下来 NN 行,每行包含两个整数 ai,bia_i, b_i,表示一个区间的两个端点。

输出格式

输出一个整数,表示最小组数。

数据范围

1N1051 \leq N \leq 10^5

109aibi109-10^9 \leq a_i \leq b_i \leq 10^9

输入样例

3
-1 1
2 4
3 5

输出样例

2

解法

我们可以使用贪心算法来解决该问题。首先对所有的区间按照右端点从小到大进行排序。然后从左到右依次遍历每个区间 [ai,bi][a_i,b_i],并且按照以下方式进行处理:

  1. 如果当前没有任何一个组,或者当前区间 [ai,bi][a_i,b_i] 与最后一个组中的所有区间都没有交集,则将当前区间 [ai,bi][a_i,b_i] 添加到一个新的组中。
  2. 否则,将当前区间 [ai,bi][a_i,b_i] 添加到最后一个组中。

通过上述方式,可以将所有的区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。

代码实现

下面是使用 C++ 语言实现的代码:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 1e5 + 10;

struct Interval {
    int l, r;

    bool operator< (const Interval& W) const {
        return r < W.r;
    }
} intervals[N];

int n;

int main() {
    cin >> n;

    for (int i = 0; i < n; i++) {
        int l, r;
        cin >> l >> r;
        intervals[i] = {l, r};
    }

    sort(intervals, intervals + n);

    vector<Interval> groups;

    for (int i = 0; i < n; i++) {
        if (groups.empty() || intervals[i].l > groups.back().r) {
            groups.push_back(intervals[i]);
        } else {
            groups.back().r = max(groups.back().r, intervals[i].r);
        }
    }

    cout << groups.size() << endl;

    return 0;
}

时间复杂度

该算法的时间复杂度为 O(NlogN)O(N\log N),其中 NN 是区间数。具体来说,排序的时间复杂度为 O(NlogN)O(N\log N),每个区间加入组的时间复杂度为 O(logN)O(\log N),因此总时间复杂度为 O(NlogN)O(N\log N)

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.把时间尺度拉长,拉长十年看当下

2.不说负面情绪,只描述事实;

3.越专注于过好自己,能量和幸运越会照顾你; 只解决问题,不做没有意义的担心,输了就认;

4.学会原谅自己,要允许自己做错事,允许自己出现情绪波动,我知道你已经很努力很努力在做好了

5.所有你害怕的、想逃避的事情,最终都要面对,既然这样不如选择坦然面对。即使结果不如人愿,没关系,至少这个过程是享受的,而不是一路带着恐惧和害怕。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!