算法打卡第5天(1道leetcode题)

前言

🌟每天打卡一道算法题,既是学习的过程,又是养成习惯的过程💡
🌟算法练习包含最基础的程序员必备题以及LeetCode🎈
🌟今天是算法题打卡第5天!🗓

1、题目描述

合并区间
以数组 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] 可被视为重叠区间。

思路:

  • 首先按照每个二维数组的第一个数字进行排序
  • 设置start和end为当前区间的开始和结尾
  • 遍历二维数组,如果下一个的起点小于当前区间的结尾,就说明这两个区间有重叠,需要去合并,此时要更新结尾
  • 如果下一个的起点,大于当前区间的结尾,说明两个区间没有重叠,也就说明之前的start、end区间是一个独立的区间,要保存。
  • 保存之后,要重新设置start、end值,继续往后遍历进而去合并。

举例:[ [1,3], [2,6], [8,10], [15,18] ]
最开始start=1、end=3,到[2,6],发现2<3(新的start<上一个的end),说明这两个区间有重叠,要进行合并,合并之后的结尾end=6。到[8,10],发现8>6(新的start>上一个的结尾),说明两个区间之间没有重叠,此时就要保存上一个的区间[1,6],这个是前两个区间合并的结果。保存之后,更新start=8,end=10,到[15,18],发现15>10(新的start>上一个的end),说明这两个区间没有重叠,要保存[8,10],这是上一个不重叠的区间。然后再去更新start=15,end=18。遍历结束了,保存当前的[15,18]([start,end]),这是最后一个区间。

public class leetcode03 {
    public static void main(String[] args) {
        int[][] array = {{1,3},{2,6},{8,10},{15,18}};
        int[][] result = method1(array);
        for (int[] ints : result) {
            System.out.println(Arrays.toString(ints));
        }
    }
    public static int[][] method1(int[][] intervals) {
        if (intervals == null || intervals.length == 0){
            return new int[0][];
        }
        //二维数组根据第一个数字排序
        Arrays.sort(intervals, Comparator.comparing(a->a[0]));
        List<Object> list = new ArrayList<>();
        int start = intervals[0][0];
        int end = intervals[0][1];

        for (int i = 1; i < intervals.length; i++) {//注意这里是从1开始的
            if (intervals[i][0] <= end){ //说明当前区间的起始位置array[i][0]小于等于end,那就说明有重叠区间,end要取最大值
                end = Math.max(end,intervals[i][1]);
            }else {
                list.add(new int[]{start,end}); // 将当前的区间
                start = intervals[i][0];
                end = intervals[i][1];
            }
        }
        list.add(new int[]{start,end});
        return list.toArray(new int[list.size()][]);
    }
}


🎈不足之处,欢迎雅正留言!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值