1. 程式人生 > >Leetcode---合併區間--利用Comparator

Leetcode---合併區間--利用Comparator

合併區間

題目連結:合併區間

思路:
  • 這道題乍一看沒什麼頭緒,不知從何下手,先看兩個區間的合併,例如[1,3]和[2,6],怎麼判斷是否可以合併呢?當時我想的是,2在[1,3]之間,那麼就可以合併,那麼也就是下一個區間的start在當前區間的範圍內就可以合併,但是如果顛倒了呢?顯然就不正確了,即[2,6],[1,3],此時1不在[2,6]內。
  • 那麼這裡發現的歸律就是要先對區間的start排序,然後再判斷區間是否可以合併。
  • 這裡出現的問題是,怎麼對區間進行排序呢?javaSE中就學過使用繼承Comparator類即可。
  • 當出現區間不能合併時就將前一個區間存入結果集,使得每次只對兩個區間進行合併操作。
public static List<Interval> merge(List<Interval> intervals) {
		if(intervals.size()==0) {
			return intervals;
		}
		List<Interval> result = new ArrayList<Interval>();
		Collections.sort(intervals,new CompareInterval());//對集合進行排序
		int left = intervals.get(0).start,right =
intervals.get(0).end; //遍歷集合 for(int i=1;i<intervals.size();i++) { if(intervals.get(i).start>=left&&intervals.get(i).start<=right) { right = Math.max(right, intervals.get(i).end); }else { Interval temp = new Interval(left,right); result.add(temp); left = intervals.
get(i).start; right = intervals.get(i).end; } } Interval temp = new Interval(left,right); result.add(temp); return result; }

下面要另寫一個比較類,或者通過內部類嵌入上面程式碼的類中也可以。

class CompareInterval implements Comparator<Interval>{
	@Override
	public int compare(Interval a, Interval b) {
		return a.start-b.start;
	}
}