【打卡第205道】【二维数组】【leetCode高频】:56. 合并区间

1、题目描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。

2、算法分析

这个题不算简单。需要有二维数组的基础知识。

二维数组基础知识:

①二维数组的列排序

// 二维数组第一列进行排序
Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]);

// 二维数组第二列进行排序
Arrays.sort(intervals,(val1,val2) -> val1[1] - val2[1]);

②表示二维数组的长度:

// 表示行数
arrays.length

// 表示列数
arrays[0].length

③二维数组的遍历

两个for循环遍历

使用foreach进行遍历:

 for(int[] interval:intervals){

interval[i]:代表的是第i + 1列

思路:

无非就这几种情况

 

①先对二维数组的列进行排序,从小到大排序

 Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]);

②定义结果集数组

③遍历数组,如果数组为空,或者当前区间的第1列的值大于结果集数组的最后一个值。

相当于区间之间并没有重叠,那么就将数组存储到结果集。

④如果当前第1列的值大于结果集数组的最后一个值。那么取最后一个元素的值,因为二维数组的元素是排序后的。

⑤index 从0开始,最后加1去掉多余的0

看代码:

3、代码实现

class Solution {
    public int[][] merge(int[][] intervals) {
        // 按照列进行排列,从小到大
        Arrays.sort(intervals,(val1,val2) -> val1[0] - val2[0]);
        // 定义结果集
        int[][] result = new int[intervals.length][2];
        // 下标
        int index = -1;
        // 遍历二维数组
        for(int[] interval:intervals){
            // index == -1代表数组为空,当前第1列的值大于结果集数组的最后一个值
            if(index == -1 || interval[0] > result[index][1]){
                // 将interval二维数组添加到结果集数组中,当然是一列一列的添加
                result[++index] = interval;
            }else{
                // 要不然进行合并
                // 要的是最后一列的最大值进行合并
                result[index][1] = Math.max(result[index][1],interval[1]);
            }
        }
        // 去掉多余的0
        return Arrays.copyOf(result,index + 1);
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值