LeetCode 热题 100 — 合并区间

0 阅读1分钟

大家好,我是银包金。今天分享的题目是LeetCode热题100中的题目 合并区间,分享解题思路。

先看题目:

image.png

题意也就是说不能有重合的部分,那么这个初始数组它可以是无序的,所以我们上来先对其进行了排序。

排序可以根据start也可以根据end,这两种都可以,只是后续遍历的时候一个从前往后一个从后往前。

这里我们以start来排序

排好序之后就可以每遍历一个就跟上一个做一次比较:看一下我的start是不是大于等于上一个的end,如果是就要合并,即直接修改上一个的end。

代码如下:

class Solution {
    public int[][] merge(int[][] intervals) {
        //排序
        Arrays.sort(intervals,(p,q)->(p[0]-q[0]));
        List<int[]>ans = new ArrayList<>();
        //遍历合并
        for(int[]p : intervals){
            int n = ans.size();
            if(n>0&& p[0] <= ans.get(n-1)[1]){
                ans.get(n-1)[1] = Math.max(ans.get(n-1)[1],p[1]);
            }else{
                ans.add(p);
            }
        }
        return ans.toArray(new int[ans.size()][]);
    }
}

这里需要注意的是:

  • ArrayList不能直接当做二维数组返回,必须toArray转换;
  • toArray(new int[ans.size()][])指定输出为二维数组,规避Object[]强转问题;
  • new int[长度][]是 Java 不规则二维数组声明,适配不定长的一维区间数组。