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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章