力扣LeetCode #56 合并区间(Merge)

- 题目描述

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

提示:intervals[i][0] <= intervals[i][1]

- 示例

  • 示例 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. 数组排序:这里是二维数组排序,因此需要改写一下Arrays.sort()方法。
  2. 从头到尾依次判断是否重叠,如果新的区间和之前的区间不重叠,就将之前区间加入链表。
  3. 将链表转换为二维矩阵,注意一下转换的方式。

- JAVA实现

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals,new Comparator<int[]>() {
            public int compare(int[] a, int[] b) {
                if(a[0]==b[0]) return a[1]-b[1];
                else return a[0]-b[0];
            }
        });
        List<int[]> ans = new ArrayList<>();   //链表的初始化
        int[] inside = new int[2];
        inside[0] = intervals[0][0];
        inside[1] = intervals[0][1];
        for(int i=1; i<intervals.length; i++) {
            if(intervals[i][0]>inside[1]) {  //说明没有重叠
                ans.add(new int[]{inside[0],inside[1]});  //向链表中添加新元素的方式
                inside[0] = intervals[i][0];
                inside[1] = intervals[i][1];
            }
            else {
                if(intervals[i][1] >= inside[1]) {
                    inside[1] = intervals[i][1];
                }
            }
        }
        ans.add(new int[]{inside[0], inside[1]});  //注意到最后在inside中的区间是还没有添加的
        return ans.toArray(new int[ans.size()][2]); //将链表转换为二维矩阵
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值