56. Merge Intervals

之前编辑了半天为什么不见了。。。

这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。

一开始我的想法是inplace的实现,看似时间复杂度O(n),常熟空间复杂度,一看大家都是跟我方法基本一样,但是还要新建一个res数组,我心里觉得特别美。。

 vector<Interval> merge(vector<Interval>& pairs) {
        sort(pairs.begin(),pairs.end(), [](const Interval& left,
                        const Interval& right){return left.start<right.start;});
            for(int i=0;i<pairs.size();++i){
                for(int j=i+1;j<pairs.size();++j){
                    if(pairs[j].start>pairs[i].end)
                        break;
                    pairs[i].end=max(pairs[j].end,pairs[i].end);
                    pairs.erase(pairs.begin()+j);
                    --j;
                    continue;
                }
            }
            return pairs;
    }

然而,当我把vim/g++通过的代码粘贴到leetcode上的时候,超时了。。。

其实erase()这个函数在删除当前item之后,会挨个把后面的每一个item都往前错一位,复杂度为O(n)。所以整个函数的复杂度是O(n^2)。怪不得超时了。。

最后贴一个时空都为O(n)的解法

vector<Interval> merge(vector<Interval> &pairs) {
        vector<Interval> res;
            sort(pairs.begin(),pairs.end(), [](const Interval& left,
                        const Interval& right){return left.start<right.start;});
            for(auto i:pairs){
                if(res.empty() || res.back().end<i.start)
                    res.push_back(i);
                else
                    res.back().end=max(res.back().end,i.end);
            }
            return res;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值