給出一個區間的集合,請合併所有重疊的區間。
示例 1:
輸入: [[1,3],[2,6],[8,10],[15,18]] 輸出: [[1,6],[8,10],[15,18]] 解釋: 區間 [1,3] 和 [2,6] 重疊, 將它們合併爲 [1,6].
示例 2:
輸入: [[1,4],[4,5]] 輸出: [[1,5]] 解釋: 區間 [1,4] 和 [4,5] 可被視爲重疊區間。
思路:
直接對數據進行排序,排序可以使用工具方法Arrary.Sort(T[], Comparison<T> comparison),自己實現比較器,可以定義方法實現也可以使用lamda表達式 ,因爲Comparison的內部實質是public delegate int Comparison<in T>(T x, T y);其實是一個委託,所以對於兩個區域的大小比較,只要比較 interval1.start和interval2.start就可以了,對於end交給合併區間去做判斷,排完序後再通過一個臨時變量保存上一個區域,通過for循環遍歷每個區域和上一個區域比較他們的 上一個區域的end節點和下一個區域的start節點,然後再比較兩個的end節點判斷是否需要合併區間。代碼如下:
/**
* Definition for an interval.
* public class Interval {
* public int start;
* public int end;
* public Interval() { start = 0; end = 0; }
* public Interval(int s, int e) { start = s; end = e; }
* }
*/
public class Solution {
public IList<Interval> Merge(IList<Interval> intervals) {
if (intervals.Count == 0 || intervals == null) return intervals;
//對區間進行排序
Interval[] intervalsarr = intervals.ToArray();
Array.Sort(intervalsarr, MyCompare);
List<Interval> mergeIntervals = new List<Interval>();
Interval temp = intervalsarr[0]; //保存上一個區域
mergeIntervals.Add(temp);
//每次將數組中的區域和前一個做比較,如果不可以合併則添加,可以合併則改變temp的end值
for (int i = 1; i < intervalsarr.Length; i++) {
if (temp.end >= intervalsarr[i].start)
{
if (temp.end < intervalsarr[i].end) {
temp.end = intervalsarr[i].end;
}
}
else {
mergeIntervals.Add(intervalsarr[i]);
temp = intervalsarr[i];
}
}
return mergeIntervals;
}
//比較兩個區間大小
public int MyCompare(Interval i1, Interval i2) {
return i1.start - i2.start;
}
}