题目:

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]

输出:[[1,6],[8,10],[15,18]]

解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]

输出:[[1,5]]

解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

 

提示:

1 <= intervals.length <= 104

intervals[i].length == 2

0 <= starti <= endi <= 104

个人思路:

1、进行排序

2、从左到右,判断区间右坐标和左坐标大小进行合并

3、输出区间

C#答案:

public int[][] Merge(int[][] intervals)

{

if (intervals.Length == 0)

{

return intervals;

}

/*基于每个区间左边界完成数组排序,保证区间左边界越小的越靠近左边。*/

intervals = intervals.OrderBy(p => p[0]).ToArray();

/*遍历数组,比较相邻区间是否能合并。如果左区间的右边界不小于右区间的左边界,则左右区间可以合并。*/

List<int[]> list = new List<int[]>();

for (int i = 0; i < intervals.Length - 1; i++)

{

/*

左区间的右边界不小于右区间的左边界,则区间可以合并。将右区间作为合并后结果,

则更新右区间的左边界为左区间的左边界。

*/

if (intervals[i][1] >= intervals[i + 1][0])

{

intervals[i + 1][0] = intervals[i][0];

/*左区间的右边界不小于右区间的右边界,则右区间的右边界更新为左区间的右边界。*/

if (intervals[i][1] >= intervals[i + 1][1])

{

intervals[i + 1][1] = intervals[i][1];

}

}

/*左区间的右边界小于右区间的左边界,则左区间不能与右区间合并,将左区间添加到结果数组中。*/

else

{

list.Add(intervals[i]);

}

}

/*将数组中最后一个元素添加到结果中。*/

list.Add(intervals[intervals.Length - 1]);

int[][] result = list.ToArray();

return result;

}

作者:somnus-23

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。