您的位置:首页 > 其它

56. Merge Intervals

2016-04-21 07:47 393 查看
之前编辑了半天为什么不见了。。。

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

一开始我的想法是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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: