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

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

示例 1:

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

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 合并区间
 *
 * @Auther: 苏察哈尔丶灿
 * @Date: 2020/8/6 20:04
 * @Slogan: 我自横刀向天笑,笑完我就去睡觉。
 */
public class Solution02 {
    public static void main(String[] args) {
//        int[][] arr = {{1, 4}, {5, 4}, {0, 1}};
//        int[][] arr = {{1, 3}, {6, 2}, {10, 8}, {15, 18}};
//        int[][] arr = {{1, 4}, {2, 3}};
        int[][] arr = {{2, 3}, {4, 5}, {6, 7}, {8, 9}, {1, 10}};
//        int[][] arr = {};

        int[][] newArr = merge(arr);
        echo(newArr);
    }

    public static int[][] merge(int[][] intervals) {

        /*
         * 首先,区间就表明 深层数组的0,1两个下表值一定不同,有大有小
         * 先给这两个0,1下标排序,排序为0下标存小值,1下标存大值
         *
         * 然后,按照0下标给所有数组进行排序,让后边数组的0下标一定比前边数组的0下标大
         *
         * 再然后
         * 后边数组的0下标值 < 前边数组的1下标值,合并
         * 后边数组的0下标值 > 前边数组的1下标值,另外起一个区间
         * 因为再往后面的数组的0下标不可能在比之前的1下标小了
         * 原因是因为我们规定过了他是一个按0下标排好序的数组了
         *
         * 开始写代码
         */

        if (intervals.length == 0) {
            return new int[0][0];
        }

        //先给这两个0,1下标排序
        for (int i = 0; i < intervals.length; i++) {
            if (intervals[i][0] > intervals[i][1]) {
                // 原地赋值更改变量值
                intervals[i][0] = intervals[i][0] + intervals[i][1];
                intervals[i][1] = intervals[i][0] - intervals[i][1];
                intervals[i][0] = intervals[i][0] - intervals[i][1];
            }
        }

        // 然后,按照0下标给所有数组进行排序
        Arrays.sort(intervals, (o1, o2) -> {
            return o1[0] - o2[0];
        });

//        echo(intervals);
//        System.out.println("=====排序完成=======");
        // 开始对比
        List<int[]> arrayList = new ArrayList<int[]>();
        // 先把初始第一个塞进去
        arrayList.add(new int[]{intervals[0][0], intervals[0][1]});
        for (int i = 1; i < intervals.length; i++) {
            int[] tempArr = arrayList.get(arrayList.size() - 1);

            // 后面的小值比前面的大值 还大
            if (tempArr[1] < intervals[i][0]) {
                // 就得另起一个区间
                arrayList.add(new int[]{intervals[i][0], intervals[i][1]});
                continue;
            }
            // 否则 合并区间
            // [1,4][2,3]防止这种坑壁情况
            arrayList.set(arrayList.size() - 1, new int[]{tempArr[0], intervals[i][1] > tempArr[1] ? intervals[i][1] : tempArr[1]});
        }

        int[][] returnArr = new int[arrayList.size()][2];

        for (int i = 0; i < arrayList.size(); i++) {
//            System.out.println(arrayList.get(i)[0] + "\t" + arrayList.get(i)[1]);
            returnArr[i][0] = arrayList.get(i)[0];
            returnArr[i][1] = arrayList.get(i)[1];
        }

        return returnArr;
    }

    // 打印数组
    public static void echo(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(Arrays.toString(arr[i]));
        }
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值