Skip to content
本页目录

0056-合并区间

https://leetcode.cn/problems/merge-intervals

以数组 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 <= 10^4
intervals[i].length == 2
0 <= starti <= endi <= 10^4

思路

第一步将所有的区间按照start进行升序排列 第二步, 将第一个区间加入数组 第三步,如果下一个区间左边界 < list中最后一个区间的右边届,则直接更新list中的最右边界 如果下一个区间的左边界 > list的右边接,那么说明后面的数字都是大于这个右边界的,必须开辟一个新的区间

注意:排序是按照开头的位置排序,不是按照 end 位置排序 如果按照 end 位置排序,就从后往前处理

注意取区间下限的时候,要取 Max ,因为前面一段的长度有可能比后面的还长

参考代码

csharp
public class Solution {
    public int[][] Merge(int[][] intervals) {
    	//按照头部排序
    	Array.Sort(intervals, (p1,p2) =>{
    		if( p1[0] > p2[0]){
                return 1;
            }
            else if(p1[0] < p2[0]){
                return -1;
            }
            else{
                return 0;
            }
    	});

        List<List<int>> result = new List<List<int>>();
        List<int> curRange = new List<int>();
        curRange.Add(intervals[0][0]);
        curRange.Add(intervals[0][1]);
        result.Add(curRange);
        for(int i=1; i<intervals.Length; i++){
            if(intervals[i][0] <= curRange[1]){
                curRange[1] = Math.Max(intervals[i][1],curRange[1]);
            }
            else{
                curRange = new List<int>();
                curRange.Add(intervals[i][0]);
                curRange.Add(intervals[i][1]);
                result.Add(curRange);
            }
        }
    	return result.Select(a => a.ToArray()).ToArray();
    }
}

参考代码:复习 20220322

csharp
public class Solution {
    public int[][] Merge(int[][] intervals) {
        //排序左节点
        Array.Sort(intervals,(a,b)=>{
            return a[0].CompareTo(b[0]);
        });
        List<IList<int>> result = new List<IList<int>>();
        //遍历
        int start = intervals[0][0];
        int end = intervals[0][1];
        for(int i=1; i<intervals.Length; i++){
            //Console.WriteLine("checking i={0},end={1}",i,end);
            if(intervals[i][0] > end){ //分段
                //Console.WriteLine("hit i={0}",i);
                result.Add(new List<int>(){start,end});
                //设置新起点
                start = intervals[i][0];
                end =  intervals[i][1];
            }
            else{
                end = Math.Max(end,intervals[i][1]);
            }
        }
        //添加最后一段
        result.Add(new List<int>(){start,end});

        //抓换为输出数组
        int[][] arr = new int[result.Count][];
        for(int i=0; i<arr.Length; i++){
            arr[i] = new int[]{result[i][0],result[i][1]};
        }
        return arr;
    }
} 

Released under the MIT License.