每天一道算法题系列三十七之合并区间

每天一道算法题系列:
来源:力扣(LeetCode)
本题链接:https://leetcode-cn.com/problems/merge-intervals/
来源是力扣,大家喜欢可以去力扣中文网做相应的其他的题,某浏览器直接搜力扣即可。
本题难度是中等

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。
示例 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] 可被视为重叠区间。

public class Solution {

    public int[][] merge(int[][] intervals) {
        int len = intervals.length;
        if (len < 2) {
            return intervals;
        }
        //这里先进行一个排序,比较的大小是每个数组的第一位
        Arrays.sort(intervals,(o1,o2)->o1[0]-o2[0]);
        //定义一个list去装数组,等后面在转化
        List<int[]> res = new ArrayList<>();
        //先给定一个初始的值,就取数组里最小的第一个
        res.add(intervals[0]);

        for (int i = 1; i < intervals.length; i++) {
            //这里主要是判断去取倒数第一位数组的值
            //因为前面是已经排序好了的数组
            int[] ints = res.get(res.size() - 1);
            /*
            * 其实这里只需要两个判断,一个是判断第一个数组的最后一位是否
            * 在第二个数组的第一位大,如果大肯定是需要重叠判断;
            * 如果小的话,直接加到list里面,继续第二次循环
            * 举个栗子:
            * [1,3] 和 [2,4] ,这个是需要重合判断的
            * [1,3] 和 [5,7],这个是不需要比较的
            * */
            if(ints[1] < intervals[i][0]){
                res.add(intervals[i]);
            }else if(ints[1] < intervals[i][1]){
                ints[1] = intervals[i][1];
            }

        }

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

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[][] intervals = {{1, 3}, {2, 6}, {6, 10}, {15, 18}};
        int[][] res = solution.merge(intervals);
        for (int i = 0; i < res.length; i++) {
            System.out.println(Arrays.toString(res[i]));
        }
    }
}

上一篇文章:每天一道算法题系列三十六之跳跃游戏
如果本篇内容有问题,请第一时间联系我,我会第一时间修改。
谢谢大家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值