力扣56. 合并区间

题目来源(力扣):

https://leetcode.cn/problems/merge-intervals/description/

题目描述:

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

基本思路:

力扣452. 用最少数量的箭引爆气球 https://www.cnblogs.com/hb-computer/articles/18553974 非常类似
将所有区间按照左端点排序,然后遍历所有区间进行合并。
当区间i的左端点在当前的[l,r]中,则对r进行更新,r=max(r,intervals[i]);
当区间i不在当前的[l,r]中时,说明形成了一个新的区间,将旧区间加入到ans中,并且更新[l,r];
具体见代码,如下:

代码实现:

class Solution
{
public:
    static bool cmp(vector<int> &a, vector<int> &b)
    {//按照左区间从小到大排序
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>> &intervals)
    {
        int len = intervals.size();
        sort(intervals.begin(), intervals.end(), cmp);
        vector<vector<int>> ans;
        vector<int> tmp(2, 0); // tmp初始化为2个0
        int l = intervals[0][0], r = intervals[0][1];
        for (int i = 1; i < len; i++)
        {
            if (intervals[i][0] > r)
            {                           // 说明形成了新区间
                tmp[0] = l, tmp[1] = r; // 将上一个区间加入到ans中
                ans.push_back(tmp);
                // 新区间[l,r]
                l = intervals[i][0];
                r = intervals[i][1];
            }
            else
            {
                r = max(r, intervals[i][1]);
            }
        }
        tmp[0] = l, tmp[1] = r; // 将最后一个区间[l,r]加入到ans中
        ans.push_back(tmp);
        return ans;
    }
};

时间复杂度

O(nlogn)
时间主要花费在排序上面,排序时间复杂度O(nlogn)
而遍历所有区间的复杂度为O(n)
总时间复杂度为O(nlogn+n),即O(nlogn)

posted @ 2024-11-19 23:06  HB_Computer  阅读(30)  评论(0)    收藏  举报