合并区间56

文章讲述了如何使用Java编程语言中的Comparator接口和匿名内部类,对区间列表进行按起始值排序并合并重叠区间的方法。通过自定义Comparator实现对区间数组的定制排序。
摘要由CSDN通过智能技术生成

问题:

合并所有重叠的区间。
如,输入[[1,3],[2,6],[8,10],[15,18]]
输出[[1,6],[8,10],[15,18]]

思路:

按照区间开始值 对区间进行排序。排序之后,可以合并的区间一定是连续的。每次判断区间的开始和结束是不是分别小于和大于。

题解:

class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals.length==0){
            return new int[0][2];
        }
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] interval1,int[] interval2){
                return interval1[0]-interval2[0];
            }
        });//匿名内部类实现自定义排序逻辑
        List<int[]> merged= new ArrayList<int[]>();//动态数组容器
        for(int i=0;i<intervals.length;i++){
            int L=intervals[i][0],R=intervals[i][1];
            System.out.println(merged.size());
            if(merged.size()==0||merged.get(merged.size()-1)[1]<L){
                merged.add(new int[]{L,R});//把数组加进去。
            }else{
                merged.get(merged.size()-1)[1]=Math.max(
                    merged.get(merged.size()-1)[1],R);
            }
            
        }
        return merged.toArray(new int[merged.size()][]);//转换为数组

    }
}

不使用匿名内部类:

class Solution {
    static class IntervalComparator implements Comparator<int[]> {
        @Override
        public int compare(int[] interval1, int[] interval2) {
            return interval1[0] - interval2[0];
        }
    }

    public int[][] merge(int[][] intervals) {
        if (intervals.length == 0) {
            return new int[0][2];
        }
        Arrays.sort(intervals, new IntervalComparator());
        ......同上
    }
}

自定义比较器

  1. 是Java中实现Comparator接口的类。可为不同的数据类型提供不同的排序逻辑。
  2. 上述代码中创建了一个匿名内部类:
Arrays.sort(intervals, new Comparator<int[]>() {
    public int compare(int[] interval1, int[] interval2) {
        return interval1[0] - interval2[0];
    }
});

实现了Comparator<int[]>接口。compare方法接收两个int[]类型的参数(这里代表两个区间),并根据起始值大小差异返回一个数值:

  • 如果interval1[0]-interval2[0]的结果小于0,则方法返回负数。意味着interval1的起始值小于interval2的起始值,表名interval1应该排在2的前面。
  • 如果结果等于0,则方法返回0。两个区间的相对位置不变。
  • 如果结果大于0,则方法返回正数,1应该排在2之后。

如此,排序完成。
再根据排序结果进行相应的安排。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值