LeetCode-Array-【56】合并区间(Java)

题目描述:

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

解法:

思路

题目要求我们将重叠的部分合并在一起,首先我们规定int left = intervals[ i ][ 0 ];
int right = intervals[ i ][ 1];那么我们只需要判断出重叠的条件是:intervals[ i ][ 1 ]>intervals[ i+1 ][ 0 ],即可,如果这个条件成立,那么我们就将Math.max(right, intervals[i+1][1])中最大的数取出来,赋值给right。然后再循环判断i后面的数组所代表的区间是否和当前区间重合,重合就循环赋值,否则就加入到res中。

详细代码:
class Solution {
    public int[][] merge(int[][] intervals) {
       List<int[]> res = new ArrayList<>();
       if(intervals==null)  return res.toArray(new int[0][]);
       Arrays.sort(intervals, new Comparator<int[]>(){
       //将数组元素的第一个按照升序进行排序
           public int compare(int[] o1,int[] o2){
               return o1[0]-o2[0];
           }
       });
       int i =0;
       while(i<intervals.length){
           int left = intervals[i][0];
           int right = intervals[i][1];
           while(i<intervals.length-1&&right>=intervals[i+1][0]){
               right = Math.max(right, intervals[i+1][1]);
               i++;
           }
           res.add(new int[]{left,right});
           i++;
       }
       //将res转换为二维数组
       return res.toArray(new int[0][]);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值