lintcode:156. 合并区间

156. 合并区间 

给出若干闭合区间,合并所有重叠的部分。

样例

给出的区间列表 => 合并后的区间列表:

[                     [
  [1, 3],               [1, 6],
  [2, 6],      =>       [8, 10],
  [8, 10],              [15, 18]
  [15, 18]            ]
]
挑战 

O(n log n) 的时间和 O(1) 的额外空间。

这道题花费了很多时间,虽然通过了,但是很多细节需要慢慢品味;
vector<Interval> merge(vector<Interval> &intervals)
{
//  合并区间write your code here给出若干闭合区间,合并所有重叠的部分。Time Limit Exceeded
vector<Interval> result;
int n=intervals.size();
if(intervals.size()==0)return result;
if(intervals.size()==1)
{Interval tmp=intervals.back();result.push_back(tmp);return result;}
int i=0;
map<int,int> sortinter;
map<int,int>::iterator upper=sortinter.begin(),low=sortinter.begin(),i1=sortinter.begin();
sortinter.insert(pair<int,int>(intervals[0].start,intervals[0].end));
for(i=1;i<n;i++)
{
//pair<int,int> tmp(intervals[i].start,intervals[i].end);
upper=sortinter.begin();low=upper;
while(upper!=sortinter.end()&&(*upper).first<=intervals[i].end)
upper++;
if(upper!=sortinter.begin())
upper--;
while(low!=sortinter.end()&&(*low).second<intervals[i].start) low++;
if(low==sortinter.end())
{//判断Low--的条件需要琢磨,如果low不满足(*low).second<intervals[i].start那么不需要减,如果Low==begin()也不需要减,只有low已经出界时才需要减
low--;
sortinter[intervals[i].start]=intervals[i].end;
continue;
}

int tmpstart=intervals[i].start<(*low).first?intervals[i].start:(*low).first;
int tmpend=intervals[i].end>(*upper).second?intervals[i].end:(*upper).second;
if(upper==low)
{
if(intervals[i].end<(*upper).second &&intervals[i].start>(*upper).first)
{
continue;
}
if(intervals[i].start>(*upper).second)
{sortinter[intervals[i].start]=intervals[i].end;continue;}
if(intervals[i].end<(*low).first)
{sortinter[intervals[i].start]=intervals[i].end;continue;}
sortinter.erase(upper);
sortinter[tmpstart]=tmpend;


}
else
{

sortinter.erase(low,++upper);
sortinter[tmpstart]=tmpend;
}
}
i=0;
i1=sortinter.begin();
while(i<sortinter.size())
{
Interval tmp((*i1).first,(*i1).second);
i1++;i++;
result.push_back(tmp);
}
return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值