您的位置:首页 > 其它

leetcode 28: Merge Intervals

2013-01-11 07:05 162 查看
Given a collection of intervals, merge all overlapping intervals.

For example,

Given
[1,3],[2,6],[8,10],[15,18]
,

return
[1,6],[8,10],[15,18]
.

/**
* Definition for an interval.
* struct Interval {
*     int start;
*     int end;
*     Interval() : start(0), end(0) {}
*     Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals) {
// Start typing your C/C++ solution below
// if intervals are sorted. it would be easy.
if( intervals.size() <= 1) return intervals;

insertion_sort( intervals );

vector<Interval> rel;
Interval base = intervals[0];
rel.push_back( base );

for( int i=1; i< intervals.size(); i++) {
Interval & pre = rel.back();
Interval & next = intervals[i];

if( pre.end < next.start ) {
rel.push_back( next );
} else if( pre.end < next.end) {
pre.end = next.end;
} // otherwise, do nohting since base case has already included the new one.
}
return rel;
}

void insertion_sort( vector<Interval> &intervals ) {
for( int i=1; i< intervals.size(); i++) {
Interval temp = intervals[i];
int j=i-1;
while(j>=0) {
if(intervals[j].start>temp.start || (intervals[j].start==temp.start && intervals[j].end>temp.end) ) {
intervals[j+1] = intervals[j];
j--;
} else {
break;
}
}
intervals[j+1] = temp;
}
}
};


/**
* Definition for an interval.
* public class Interval {
*     int start;
*     int end;
*     Interval() { start = 0; end = 0; }
*     Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
// Start typing your Java solution below
// DO NOT write main() function
ArrayList<Interval> res = new ArrayList<Interval>();

int sz = intervals.size();
if(sz<1) return res;

Collections.sort(intervals, new IntervalComparator());
res.add(new Interval(intervals.get(0).start, intervals.get(0).end ) ); //this won't modify the original input.

for(int i=1; i<sz; i++) {
Interval last = res.get(res.size()-1);
Interval x = intervals.get(i);

if(last.end < x.start) {
res.add( new Interval(intervals.get(i).start, intervals.get(i).end ) );
} else if( last.end < x.end) {
last.end = x.end;
}
}
return res;
}

class IntervalComparator implements Comparator<Interval>{
public int compare(Interval a, Interval b) {
if(a.start < b.start) return -1;
else if(a.start>b.start) return 1;
else {
if(a.end<b.end) return -1;
else if(a.end>b.end) return 1;
else return 0;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: