56. Merge Intervals
2016-04-21 07:47
393 查看
之前编辑了半天为什么不见了。。。
这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。
一开始我的想法是inplace的实现,看似时间复杂度O(n),常熟空间复杂度,一看大家都是跟我方法基本一样,但是还要新建一个res数组,我心里觉得特别美。。
然而,当我把vim/g++通过的代码粘贴到leetcode上的时候,超时了。。。
其实erase()这个函数在删除当前item之后,会挨个把后面的每一个item都往前错一位,复杂度为O(n)。所以整个函数的复杂度是O(n^2)。怪不得超时了。。
最后贴一个时空都为O(n)的解法
这道题其实想法挺简单的,就是先对数组排序,然后从头开始遍历。对任意一个区间,从当前点开始,一个一个比较自身和后面的区间有没有交集,更新当前区间。
一开始我的想法是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; }
相关文章推荐
- 如何在 CentOS 7 中添加新磁盘而不用重启系统
- 如何在 CentOS 7 中添加新磁盘而不用重启系统
- 个人工作总结03
- 我是一个线程(修订版)
- Openstack学习笔记(十四)-Horizon学习笔记(四)
- [bzoj1799]同类分布 [bzoj4521]手机号码
- HARK学习(八)--LoadSourceLocation
- 梦见教训学生的周公解梦
- salesforce 零基础学习(十七)Trigger用法
- vi/vim常用命令
- 修改后的神经网络
- AFN 获取数据,数据解析:JSON 介绍
- Mini-Shell without pipes
- 团队项目个人工作总结(4月21日)
- 我是一个Java class
- Linux磁盘管理
- 站立会议03
- Windows UWP
- 在浏览器中下载Google play store软件
- 个人工作总结03