leetcode_56. 合并区间

发布于:2024-08-20 ⋅ 阅读:(129) ⋅ 点赞:(0)

56. 合并区间

题目描述:

以数组 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

贪心思路:

  1. 对输入的二维数组 intervals 按照区间的起始进行排序。初始化两个变量 left 和 right,分别代表当前合并区间的左右边界。
  2. 定义一个 List<int[]> 类型的 ans 列表,用来存储最终合并后的区间。
  3. 从第二个区间开始遍历 intervals 数组:
    1. 如果当前区间的起始 intervals[i][0] 小于等于当前合并区间的结束 right,说明当前区间可以合并到当前合并区间中。此时更新 right 为当前合并区间的结束时间和当前区间结束的最大值。
    2. 如果当前区间的起始 intervals[i][0] 大于当前合并区间的结束 right,说明当前区间无法合并到当前合并区间中。此时将当前合并区间添加到 ans 列表中,并更新 left 和 right 为当前区间的起始和结束。
  4. 在遍历完所有区间之后,将最后一个合并区间添加到 ans 列表中。

时间复杂度为 O(n log n),主要由排序操作造成。空间复杂度为 O(n),因为需要存储最终合并后的区间。这个算法使用贪心的方法,在遍历过程中不断合并重叠的区间,最终得到合并后的区间集合。

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
        int left = intervals[0][0];
        int right = intervals[0][1];
        int i = 1;
        List<int[]> ans = new ArrayList<>();

        while (i < intervals.length) {
            if (right >= intervals[i][0]) {
                right = Math.max(right, intervals[i][1]);
            } else {
                //ans.add
                ans.add(new int[]{left,right});

                left = intervals[i][0];
                right = intervals[i][1];
            }
            i++;
        }
        ans.add(new int[]{left,right});
        return ans.toArray(new int[ans.size()][]);
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到