Leetcode56. 合并区间(JAVA排序+双指针)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode56. 合并区间(JAVA排序+双指针)相关的知识,希望对你有一定的参考价值。

题目链接:https://leetcode-cn.com/problems/merge-intervals/

解题思路

先按左端点排序,然后更新右端点。不难发现这有三种情况,如图:
image.png
第一种情况:①的右端点小于当前区间的右端点

第二种情况:②的右端点大于当前区间的右端点,且②的左端点小于当前区间的右端点

第三种情况:③的左端点和右端点都比当前区间的右端点大

综上,我们可以发现:

如果当前区间右端点大于要比较的区间的左端点,那么这两个区间就可以合并,并且合并之后的右端点为这两个区间右端点的较大值;

如果当前区间右端点小于要比较的区间的左端点,那么这两个区间就不可以合并,并且开始统计下一个区间,右端点为下一个区间的右端点。

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);  //按左端点排序
        int r = intervals[0][1];        //右端点
        int l = intervals[0][0];        //左端点
        int k = 0;                      //计算最后合并区间个数
        for(int i = 1; i < intervals.length; i++) {
            if(intervals[i][0] <= r) {  //左端点小于当前的右端点
                r = Math.max(intervals[i][1], r);   //合并区间,更新右端点
            } else {
                intervals[k][0] = l;    //记录合并的区间
                intervals[k][1] = r;
                k++;
                l = intervals[i][0];    //下一个区间左端点
                r = intervals[i][1];    //下一个区间右端点
            }
        }
        intervals[k][0] = l;    //最后还有一个区间要保存
        intervals[k][1] = r;
        k++;
        return Arrays.copyOf(intervals, k); //截取最后k个合并区间
    }
}

复杂度分析

  • 时间复杂度:O(nlogn)
  • 空间复杂度:O(n)

以上是关于Leetcode56. 合并区间(JAVA排序+双指针)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—56. 合并区间( 排序)—day37

Leetcode刷题100天—56. 合并区间( 排序)—day37

LeetCode 56. 合并区间

leetcode 每日一题 56. 合并区间

leetcode 每日一题 56. 合并区间

leetcode56-合并区间(c++/python)