合并区间(贪心)

28 篇文章 0 订阅
23 篇文章 0 订阅

一、题目

二、代码 

贪心算法:

  • 先按照区间左端点的值升序排序
  • 如果当前遍历到的区间的左端点大于结果集中最后一个区间的右端点,说明它们没有交集,此时把区间添加到结果集

  • 如果当前遍历到的区间的左端点小于结果集中最后一个区间的右端点,说明它们有交集,合并

此题知识点较多,通过实现Comparator接口来自定义排序以及链表到二维数组的转化等

class Solution {
 public int[][] merge(int[][] intervals) {
        if(intervals.length < 2) return intervals;
        // 排序:根据区间开始值升序
       // Arrays.sort(intervals, (v1, v2) -> v1[0] - v2[0]);
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        LinkedList<int []> result = new LinkedList<>();
        //将排好序的第一个元素放入结果集中
        result.add(intervals[0]);
        for(int i = 1; i < intervals.length; i++){
            if(result.getLast()[1] < intervals[i][0]){
                //此时一维数组代表区间
                result.add(intervals[i]);
            }else{
                //定义一个last变量指向从结果集取出的数组
                int[] last = result.getLast();
                last[1] = Math.max(last[1], intervals[i][1]);
            }
        }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值