leecode56 合并区间

在这里插入图片描述

我的思路

题目分析:

  1. 需要遍历所有的区间数据,我们需要对区间数据进行排序,将这个区间调整为开头元素递增的顺序。
  2. 然后不断遍历这个排序后的数组,不断更新新区间即可。

答题思路:

  1. 先排序
  2. 遍历排序后的每一个数组元素,然后在这个循环中遍历这个数组后续的元素,比较大小
  3. 更新数组

最开始的时候,我是利用这个List获取新的数组,最后将这个list转化为二维数组,但是这种方法涉及到多次的装箱和拆箱工作,且占用额外的空间

public int[][] merge(int[][] intervals) {
    //对数组进行排序
    Arrays.sort(intervals, (o1, o2) ->o1[0]-o2[0]);
    //遍历数组进行调整
    List<List<Integer>> list = new ArrayList<>();
    for(int i = 0;i<intervals.length;i++){
        int start = intervals[i][0];
        int end = intervals[i][1];
        int j =0;
        for( j= i+1;j<intervals.length;j++){
            if(intervals[j][0]<=end){
                end = Math.max(intervals[j][1],end);//更新这个结束
            }else{
                break;//直接结束即可
            }
        }
        List<Integer> ans = new ArrayList<>();
        ans.add(start);
        ans.add(end);
        list.add(ans);
        i = j-1;
    }
    int[][] res = list.stream()
              .map(l -> l.stream().mapToInt(Integer::intValue).toArray())
              .toArray(int[][]::new);
    return res;
}

后续我发现可以不用新建集合,直接在原有数组上进行操作即可。

public int[][] merge(int[][] intervals) {
    //对数组进行排序
    Arrays.sort(intervals, (o1, o2) ->o1[0]-o2[0]);
    //遍历数组进行调整
    int write =0;
    for(int i = 0;i<intervals.length;i++){
        int start = intervals[i][0];
        int end = intervals[i][1];
        int j =0;
        for( j= i+1;j<intervals.length;j++){
            if(intervals[j][0]<=end){
                end = Math.max(intervals[j][1],end);//更新这个结束
            }else{
                break;//直接结束即可
            }
        }
        intervals[write][0]=start;
        intervals[write][1]=end;
        write++;
        i = j-1;
    }
    return Arrays.copyOf(intervals, write);
}

灵神思路

灵神的思路和我大体一致,有几点不同。
他是利用这个List<int[]> ans = new ArrayList<>();来存储结果,并利用ans.toArray(new int[ans.size()][]);转换为二维数组。
他利用的是ans.get(m-1)[1]来获取的这个上一个区间的右端点,我是直接遍历的。

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 m = ans.size();
            if (m > 0 && p[0] <= ans.get(m - 1)[1]) { // 可以合并
                ans.get(m - 1)[1] = Math.max(ans.get(m - 1)[1], p[1]); // 更新右端点最大值
            } else { // 不相交,无法合并
                ans.add(p); // 新的合并区间
            }
        }
        return ans.toArray(new int[ans.size()][]);
    }
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/merge-intervals/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值