Post

区间合并算法

区间合并问题是一个经典的问题,通常可以通过排序和遍历来解决。先根据起始位置进行排序。使用新的列表来储存合并后的区间。遍历排序后的区间,如果当前区间的起始位置大于合并列表中最后一个区间的结束位置,则将当前区间添加到合并列表中。否则,更新合并列表中最后一个区间的结束位置为当前区间的结束位置和它的结束位置的最大值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void mergeIntervals(vector<pair<int, int>> &intervals)
{
    if (intervals.empty())
        return;

    // 按区间起始位置排序
    sort(intervals.begin(), intervals.end());

    vector<pair<int, int>> merged;
    merged.push_back(intervals[0]);

    for (int i = 1; i < intervals.size(); i++)
    {
        if (intervals[i].first > merged.back().second)
        {
            merged.push_back(intervals[i]);
        }
        else
        {
            merged.back().second = max(merged.back().second, intervals[i].second);
        }
    }

    intervals = merged;
}
This post is licensed under CC BY 4.0 by the author.