56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

解题思路:首先将每个区间的项首排序,这样方便判断是否能够进行合并。eg:要合并区间[3,8],[1,4],[6,9],[23,45].

  1. 直观地还是要先按照第一个元素排序:
    【1,4】,【3,8】,【6,9】,【23,45】;

  2. 判断能否前两个区间:
    4>=3成立,可以合并前两项;

  3. 然后选新区间项尾:
    max(4,8)=8,即可得到合并去区间【1,8】;

  4. 接着判断新区间【1,8】和第三项【6,9】能否合并:
    首先8>6,得知可以合并该项;

  5. 然后选新区间项尾:
    max(8,9)=8,即可得到合并去区间【1,9】;

  6. 判断【1,9】和【23,45】能否合并:
    9>23不成立,不能合并,则添加新区间【23,45】
    最终得到合并后的区间【1,9】,【23,45】。

代码实现
根据思路就很好写出代码实现,但是还是要注意数据类型的灵活应用,选择合适的数据类型,能够更便捷根据思路实现代码。
根据思路,提炼出以下几点:

  • 可以使用Arrays.sort()方法对二维数组进行排序,这是一个知识点:

    • 重写compare()
    • 使用Lambda表达式的方式简写Comparator比较器;Arrays.sort(intervals, (p, q)->p[0]-q[0]);
    • Arrays.sort(arr, Comparator.comparingInt(a->a[0]))。
  • 要定义一个合适的容器存储新区间:List<int[]> ans = new ArrayList<>();

  • 2,3和4,5和6步骤可以做一个循环语句实现。

for(int[] a:intervals){
            int b= ans.size();
            if(b>0 && ans.get(b-1)[1]>=a[0]){
                if(ans.get(b-1)[1]<a[1]){
                    ans.get(b-1)[1] = a[1];
                }
            }
            else{
                ans.add(a);
            }
        }

最后得到整体的代码

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (p, q)->p[0]-q[0]);
        List<int[]> ans = new ArrayList<>();
        for(int[] a:intervals){
            int b= ans.size();
            if(b>0 && ans.get(b-1)[1]>=a[0]){
                if(ans.get(b-1)[1]<a[1]){
                    ans.get(b-1)[1] = a[1];
                }
            }
            else{
                ans.add(a);
            }
        }
        return ans.toArray(new int[ans.size()][]);
    }
}

总结:对于这道题依旧是思路不难,还是要灵活运用数据结构和方法,这个过程需要慢慢积累经验,熟练就好。yeah,继续前进吧。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值