56. 合并区间

image

56. 合并区间

思路

  1. 排序:首先按照每个区间的起始位置 start 升序排列。这样可以保证我们按顺序处理区间,便于判断是否重叠。

  2. 遍历合并

    • 维护一个结果列表 result

    • 将第一个区间加入结果列表。

    • 对于后续每一个区间:

      • 如果当前区间的 start 大于结果列表中最后一个区间的 end,说明不重叠,直接加入。
      • 否则说明重叠,则将结果列表中最后一个区间的 end 更新为两者 end 的最大值(即合并)。

复杂度分析

  • 时间复杂度O(n log n)

    • 排序:O(n log n),其中 n 是区间个数。
    • 遍历合并:O(n)
    • 总体时间复杂度由排序主导。
  • 空间复杂度O(n)

    • n 为不重叠的区间个数

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        // 排序
		Arrays.sort(intervals, (a, b) -> (a[0] - b[0]));
		// 结果
		LinkedList<int[]> res = new LinkedList<>();
		// 将第一个区间添加进结果
		res.add(intervals[0]);
		// 从第二个开始遍历
		for (int i = 1; i < intervals.length; i++) {
			int[] curr = intervals[i];
			int[] last = res.getLast();
			if (curr[0] > last[1]) {
				// 如果当前区间最小值大于结果最后区间的最大值,直接加入
				res.add(curr);
			} else {
				// 否则,结果最后区间更新最大值
				last[1] = Math.max(last[1], curr[1]);
			}
		}
		return res.toArray(new int[0][0]);
    }
}
posted @ 2025-08-08 23:32  quanht  阅读(9)  评论(0)    收藏  举报