56. 合并区间

贪心

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;

class Solution {
    public int[][] merge(int[][] intervals) {

        /**
         * 将区间按照起始坐标排序
         */
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        LinkedList<int[]> list = new LinkedList<>();
        list.add(new int[]{intervals[0][0], intervals[0][1]});

        /**
         * 先将第一个区间放进列表,然后遍历原数组,和列表最后一个元素比较
         * 如果重叠就删除最后一个元素,放入合并区间;否则就直接放入这个区间
         */
        for (int i = 1; i < intervals.length; i++) {

            int[] temp = list.getLast();

            if (intervals[i][0] <= temp[1]){

                list.removeLast();
                list.add(new int[]{Math.min(temp[0], intervals[i][0]), Math.max(temp[1], intervals[i][1])});
            }
            else{
                list.add(new int[]{intervals[i][0], intervals[i][1]});
            }
        }

        return list.toArray(new int[list.size()][]);
    }
}

/**
 * 时间复杂度 O(nlogn)
 * 空间复杂度 O(n)
 */

优化1——原地更新区间边界

import java.util.Arrays;
import java.util.Comparator;
import java.util.LinkedList;

class Solution {
    public int[][] merge(int[][] intervals) {

        /**
         * 将区间按照起始坐标排序
         */
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

        LinkedList<int[]> list = new LinkedList<>();
        int left = intervals[0][0];

        /**
         * 记录每个答案的左边界,遍历原数组,如果下一个区间不重叠,就添加答案,更新下一个答案的左边界
         * 如果重叠只更新区间的最大右边界,直到不重叠为止
         */
        for (int i = 1; i < intervals.length; i++) {

            if (intervals[i][0] > intervals[i - 1][1]){

                list.add(new int[]{left, intervals[i - 1][1]});
                left = intervals[i][0];
            }
            else{
                intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
            }
        }

        /**
         * 最后一个区间需要单独添加
         */
        list.add(new int[]{left, intervals[intervals.length - 1][1]});

        return list.toArray(new int[list.size()][]);
    }
}

/**
 * 时间复杂度 O(nlogn)
 * 空间复杂度 O(n)
 */

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

posted @   振袖秋枫问红叶  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示