算法探索_合并区间

问题描述:

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

示例 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] 可被视为重叠区间。

提示:

intervals[i][0] <= intervals[i][1]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-intervals

解决思路:

1.排序,因为测试用例非常的狗

2.合并,主意第一个数和第二个数都要进行判断

    /*
     *作者:赵星海
     *时间:2020/8/28 9:18
     *用途:合并区间
     */
    public int[][] merge(int[][] intervals) {
        //针对类似这种情况 [[1,4],[0,0]] 官方要求输出:[[0,0],[1,4]]
        //先排序后合并!!!破用例 搞死我吧
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] a, int[] b) {
                return a[0] - b[0];
            }
        });
        List<int[]> list = new ArrayList<>();
        for (int i = 0; i < intervals.length; i++) {
            //拿前一个子数组的尾部数与后一个数组的头部数比较大小,如果前大于后 则合并
            int j = i + 1;
            //合并区间
            while (j < intervals.length
                    && (intervals[i][0] > intervals[j][0]
                    || intervals[i][1] >= intervals[j][0])) {
                if (intervals[i][0] > intervals[j][0]) {
                    // 针对类似这种情况 [[1,4],[0,4]]
                    intervals[i][0] = intervals[j][0];
                }
                if (intervals[i][1] < intervals[j][1]) {
                    intervals[i][1] = intervals[j][1];
                }
                j++;
            }
            //合格数据装填
            list.add(intervals[i]);
            //装完数据后i跨步,越过不合格数据
            i = j - 1;
        }
        int[][] ints = new int[list.size()][];
        for (int i = 0; i < list.size(); i++) {
            ints[i] = list.get(i);
        }
        return ints;

    }

LeetCode提交结果:

扫描二维码关注公众号,回复: 11646646 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_39731011/article/details/108275382