AC牛客 BM89 合并区间

简介: AC牛客 BM89 合并区间

BM89 合并区间

题目描述

描述

给出一组区间,请合并所有重叠的区间。
请保证合并后的区间按区间起点升序排列。

要求:空间复杂度O(n),时间复杂度O(nlogn)
进阶:空间复杂度O(val),时间复杂度O(val)

示例1

输入:
[[10,30],[20,60],[80,100],[150,180]]

返回值:
[[10,60],[80,100],[150,180]]

示例2

输入:
[[0,10],[10,20]]

返回值:
[[0,20]]

解题思路

解法 排序然后合并

1.先将list排序,以start从小到大排序,如果start相等,则以end从小到大排序
2.从index==1,开始遍历list,针对于每两个元素,有以下三种情况

  • 情况一:当前区间完全覆盖上一区间覆盖,则我们直接更新此区间,把上一个区间合入当前区间
  • 情况二:当前区间的左端点严格大于上一区间的右端点,则表示该区间不能合并,则把上一区间加入结果数据
  • 情况三:当前区间与上一区间有相等的区域,那么我们自己合并这两个区间,这儿有个取巧的办法,就是直接求两个start的min,两个end的max,则为合并后的区间

3.遍历完成,记得把区间的最后一个加入结果

实践代码

解法

import java.awt.image.ImagingOpException;
import java.util.*;

public class Solution {
    public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
        ArrayList<Interval> res = new ArrayList<>();
        if (intervals == null || intervals.size() <= 0) {
            return res;
        }
        Collections.sort(intervals, new Comparator<Interval>() {

            @Override
            public int compare(Interval o1, Interval o2) {
                if (o1.start != o2.start) {
                    return o1.start - o2.start;
                } else {
                    return o1.end - o2.end;
                }
            }
        });
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals.get(i).start <= intervals.get(i - 1).end) {
                intervals.get(i).start = Math.min(intervals.get(i - 1).start, intervals.get(i).start);
                intervals.get(i).end = Math.max(intervals.get(i - 1).end, intervals.get(i).end);
            } else if (intervals.get(i).start > intervals.get(i - 1).end) {
                res.add(intervals.get(i - 1));
            }
        }
        res.add(intervals.get(intervals.size() - 1));
        return res;
    }
}
目录
相关文章
|
5月前
|
存储
【每日一题Day307】LC56合并区间 | 排序
【每日一题Day307】LC56合并区间 | 排序
18 0
|
7月前
|
Serverless
华为机试HJ30:字符串合并处理
华为机试HJ30:字符串合并处理
|
10月前
|
Go vr&ar
CF中的线段树题目
CF中的线段树题目
52 0
|
12月前
|
算法 程序员
【牛客算法BM2】 链表内指定区间反转
你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目,让我们一起来挑战一下吧!作者也是在学习的过程中刷到有意思的题目就会选择与大家分享,并且提供较优解,关于力扣 的文章全部放在博客,如果大家喜欢记得支持作者。🤓
(序列)(贪心)(LIS)(区间dp)最少拦截系统
(序列)(贪心)(LIS)(区间dp)最少拦截系统
54 0
AC牛客 BM4 合并两个排序的链表
AC牛客 BM4 合并两个排序的链表
74 0
AC牛客 BM4 合并两个排序的链表
AC牛客 BM46 最小的K个数
AC牛客 BM46 最小的K个数
30 0
AC Leetcode-56 合并区间
AC Leetcode-56 合并区间
41 0
AC牛客 BM16 删除有序链表中重复的元素-II
AC牛客 BM16 删除有序链表中重复的元素-II
47 0
AC牛客 BM97 旋转数组
AC牛客 BM97 旋转数组
54 0