Leetcode56. 合并区间(JAVA排序+双指针)
Posted !0 !
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode56. 合并区间(JAVA排序+双指针)相关的知识,希望对你有一定的参考价值。
题目链接:https://leetcode-cn.com/problems/merge-intervals/
解题思路
先按左端点排序,然后更新右端点。不难发现这有三种情况,如图:
第一种情况:①的右端点小于当前区间的右端点
第二种情况:②的右端点大于当前区间的右端点,且②的左端点小于当前区间的右端点
第三种情况:③的左端点和右端点都比当前区间的右端点大
综上,我们可以发现:
如果当前区间右端点大于要比较的区间的左端点,那么这两个区间就可以合并,并且合并之后的右端点为这两个区间右端点的较大值;
如果当前区间右端点小于要比较的区间的左端点,那么这两个区间就不可以合并,并且开始统计下一个区间,右端点为下一个区间的右端点。
代码
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