给出一个区间的集合,请合并所有重叠的区间。
示例 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;
}
}