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

猜你喜欢

转载自blog.csdn.net/m0_37845126/article/details/83120070
今日推荐