leetcode56. Merge Intervals

博客分享了一种解决区间合并问题的朴素思路,通过排序和遍历实现,避免使用线段树。代码实现中,首先对区间进行排序,然后遍历合并重叠区间,最后得到不重叠的区间集合。时间复杂度为O(nlogn),空间复杂度为O(n)。博主表示对朴素方法能解决问题感到惊喜,并鼓励自己继续努力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:题目链接

思路:区间合并。我之前一直以为要线段树做,一直放着。今天实在不会做其他的了,就尝试用最朴素的方法做一下。没想到还过了,真是惊喜。
具体做法:先排序,然后遍历所有区间,一个一个合并。
因为你从小大排序了,就表明后面的区间一定接在前面区间后,要么和前面区间合并,要么无法合并。看代码吧:

class Solution {
public:
    static bool cmp(vector<int>& a, vector<int>& b) {//如果第一个不一样就按第一个从小到大排,否则就按照第二个从小到大排
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), cmp);//其实不用cmp也可以,它默认就是从小到大
        vector<vector<int> > ans;
        int s = intervals[0][0], e = intervals[0][1];//初始化s,e s为起点,e为终点
        for (auto& interval : intervals) {
            if (interval[0] > e) {//如果没有重合部分,表示当前s,e已经是一组区间了,不能合并了。把他加入答案,同时将此时的interval更新为s,e
                ans.push_back({ s,e });
                s = interval[0];
                e = interval[1];
            }
            else e = max(e, interval[1]);//有重叠,肯定是s肯定不会变,只需要取最大的e就可以了。
        }
        ans.push_back({ s,e });//由于最后一组区间没有加入,所以记得加入。
        return ans;
    }
};

时间复杂度:O(nlogn)
空间复杂度:O(n)

还是挺惊喜的。加油加油加油加油加油!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值