leetcode-56. Merge Intervals
题目:
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].
刚做这题的时候脑子抽风了,不知道为什么从后往前遍历,实际上这样稍微麻烦一些。直接从前往后就行。
这题的基本思路就是先按照start或者end排序,然后再分情况讨论相邻的interval的end或者start大小就行。
/**
* 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 List<Interval> merge(List<Interval> intervals) {
Collections.sort(intervals,new Comparator<Interval>(){
@Override
public int compare(Interval v1, Interval v2){
if(v1.end==v2.end)
return v1.start-v2.start;
return v1.end-v2.end;
}
});
/* for(Interval I : intervals){
System.out.println(I.start+" "+I.end);
}*/
for(int i = intervals.size()-1 ; i > 0 ;i--){
// System.out.println(i+" "+intervals.get(i).start+" "+intervals.get(i).end);
if(intervals.get(i-1).start>intervals.get(i).start)
intervals.remove(i-1);
else{
if(intervals.get(i-1).end>=intervals.get(i).start){
intervals.get(i).start=intervals.get(i-1).start;
intervals.remove(i-1);
}
}
}
return intervals;
}
}
贴一个正常思路的:
答案来源
/**
* 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 List<Interval> merge(List<Interval> intervals) {
if (intervals.size() <= 1)
return intervals;
// Sort by ascending starting point using an anonymous Comparator
Collections.sort(intervals, new Comparator<Interval>() {
@Override
public int compare(Interval i1, Interval i2) {
return Integer.compare(i1.start, i2.start);
}
});
List<Interval> result = new LinkedList<Interval>();
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for (Interval interval : intervals) {
if (interval.start <= end) // Overlapping intervals, move the end if needed
end = Math.max(end, interval.end);
else { // Disjoint intervals, add the previous one and reset bounds
result.add(new Interval(start, end));
start = interval.start;
end = interval.end;
}
}
// Add the last interval
result.add(new Interval(start, end));
return result;
}
}