每日打卡:合并区间

137 阅读2分钟

这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战

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

  • 1 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <= starti <= endi <= 104

原题链接

读题读了一段时间,首先我们要搞懂合并区间的条件是什么。

341A9DFE4A434C26A5B05D67B783C081.jpg

这道题我最开始一下子就想到了双指针,但是后来我发现一件事,就是他的区间排序是无序的。

那我们有没有办法让它变得有序呢?

那就涉及到我们的一个知识点,我可能学过,但是我忘了

就是我们Arrays.sort()自定义排序

sort()方法会接受一个比较函数compare(a, b),该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。最后,永远要记住一句话,凡是返回1或者大于0的正数的时候就要交换位置。

 //按照第一列数字以升序排列
 Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return a[0]-b[0];
            }
        })

当我们这一个关键点完成之后,思路直接就十分清晰了,我们先确定一个左指针,右指针向右遍历,下一组的第一个数小于上一组的第二个数,我们这两个区间就可以合并了,

F1AC84AA1438A91D91195E19B7CEDF8C.jpg

    public int[][] merge(int[][] intervals) {
        if(intervals.length==0){
            return new int [0][2];
        }
        Arrays.sort(intervals,new Comparator<int[]>(){
            public int compare(int[] a,int[] b){
                return a[0]-b[0];
            }
        });
        List<int[]> res = new ArrayList<int[]>();
        for(int i=0;i<intervals.length;i++){
            //要注意到,我们的区间就只有两个数字所以我们直接使用两个变量
            int left = intervals[i][0];
            int right= intervals[i][1];
            //left和right都是代表此时循环的区间,我们如果想要寻找我们上一个区间,我们就可以利用我们的集合,跳转到我们上一个区间的第二个数(res.get(res.size()-1)[1]),进行比较
            if(res.size()==0||res.get(res.size()-1)[1]<left){
                //我们的区间没有重叠,我们就把此时的区间存入集合
                res.add(new int[]{left,right});
            }else{
                //重叠了,我们就更新一下我们集合中上一个区间的第二个数,已经存入第一个数了,发现重叠去改第二个数
                res.get(res.size()-1)[1] = Math.max(res.get(res.size()-1)[1],right);
            }
        }
        return res.toArray(new int[res.size()][]);
    }

在代码中,我们使用了集合的方式来存如我们的数组,是因为,我如果是使用数组的方式赋值,我们最后返回的是一个二维数组,我们数组的列的长度,我们不能很好的去做判断,而且,我们在给数组的赋值的时候,需要一个一个的去赋值,也很麻烦,我们把一组区间存入集合,集合是动态扩容的省去了很多麻烦,最后返回的时候,再把我们的集合转变成一个二维数组就可以了。