【Hot100】LeetCode—56. 合并区间


  • 原题连接:56. 合并区间

1- 思路

image.png

贪心

  • 1- 先对数组根据首元素排序
  • 2- 遍历数组,根据 left 和 right 维护一个左右区间。判断是否重叠
    • 不重叠:收集结果
    • 重叠:更新 right

2- 实现

⭐56. 合并区间——题解思路

在这里插入图片描述

class Solution {
    public int[][] merge(int[][] intervals) {
        // 1.数据结构
        Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));

        List<int[]> res = new ArrayList<>();
        // left 和 right
        int left = intervals[0][0];
        int right = intervals[0][1];

        // 2. 遍历
        for(int i = 1 ; i < intervals.length;i++){
            // 2.1 不重叠
            if(intervals[i][0]>right){
                res.add(new int[]{left,right});
                left = intervals[i][0];
                right = intervals[i][1];
            }else{
                right = Math.max(right,intervals[i][1]);
            }
        }

        res.add(new int[]{left,right});

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

3- ACM 实现

public class mergeIntervals {

    public static int[][] merge(int[][] intervals){
        // 1. 排序
        Arrays.sort(intervals,(o1,o2) -> Integer.compare(o1[0],o2[0]));
        // 2.数据结构
        List<int[]> res = new ArrayList<>();
        int left = intervals[0][0];
        int right = intervals[0][1];

        // 3.遍历
        for(int i = 1 ; i < intervals.length;i++){
            // 覆盖
            if(intervals[i][0]>right){
                res.add(new int[]{left,right});
                left = intervals[i][0];
                right = intervals[i][1];
            }else{
                right = Math.max(right,intervals[i][1]);
            }
        }
        // 4. 结果
        res.add(new int[]{left,right});
        return res.toArray(new int[res.size()][]);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("输入二维数组个数");
        int n = sc.nextInt();
        int[][] intervals = new int[n][2];
        for(int i = 0 ; i < n ; i++){
            intervals[i][0] = sc.nextInt();
            intervals[i][1] = sc.nextInt();
        }
        int[][] res  = merge(intervals);
        for(int[] r:res){
            System.out.print("[" + r[0] + ", " + r[1] + "]");
        }
    }
}

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值