1. 程式人生 > >56. 合併區間

56. 合併區間

給出一個區間的集合,請合併所有重疊的區間。

示例 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;
    }
}