LeetCode.56 合并区间

本文介绍了一种解决LeetCode上合并区间问题的有效方法。通过首先对区间按起点排序,然后逐一比较并合并区间,实现了简洁高效的解决方案。文章提供了完整的Java实现代码。

原题

https://leetcode-cn.com/problems/merge-intervals/

在这里插入图片描述

思路
按照每个区间的起点进行排序,然后逐一比较合并

题解

package com.leetcode.code;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @ClassName Code56
 * @Author ZK
 * @Description
 * @Date 2021/2/3 14:56
 * @Version 1.0
 **/
public class Code56 {

    public static void main(String[] args) {
        int[][] intervals = {{1,3},{15,18},{8,10},{2,6}};
        int[][] ints = merge(intervals);
        for (int[] anInt : ints) {
            System.out.println(Arrays.toString(anInt));
        }
    }

    public static int[][] merge(int[][] 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];
            }
        });


        int len = intervals.length;
//        定义返回的二维数组,其长度为输入数组长度len,肯定够用,可能会有空余,返回时处理
        int[][] res = new int[len][2];
//        下标记录
        int index = 0;
//        定义一个临时数组,临时数组的值先记录第一个
        int[] temp = {intervals[0][0],intervals[0][1]};
//        从第二个开始遍历,因为第一个已经被临时数组记录过了
        for (int i = 1; i < len; i++) {
//            得到每一个数组
            int[] cur = intervals[i];

//            判断每一个数组的起始下标所处位置
//            当前数组的起始位置位于临时数组的内部
            if (cur[0] >= temp[0] && cur[0] <= temp[1]) {
//                判断每一个数组的结束下标所处位置
//                当前数组的结束下标位于临时数组的内部,则不用处理,是被临时数组包含的关系
                if (cur[1] <= temp[1]) {
//                    temp不变
                } else {
//                    当前数组的结束下标位于临时数组的右边,需要处理
//                    将临时数组的右边界,修改为当前数组的右边界,相当于进行了合并
                    temp[1] = cur[1];
                }
            }else{  // 此时:cur[0] > temp[1],当前数组的起始位置在临时数组的右边,相当于两个区间没有交集
//                由于事先已经对于区间按照起始下标进行了排序
//                所以后续的区间也不会再和临时数组有任何交集了,临时区间可以作为一个结果进行保存了
                res[index++] = temp;
//                再将当前数组变成临时数组,依次与后边的区间进行对比
                temp = cur;
            }
        }
//        最后将最终的临时数组也记录到结果中保存下来
        res[index] = temp;

//        返回结果数组res中的有效元素,也就是index+1个
        return Arrays.copyOf(res, index+1);
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

难过的风景

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值