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;
    }
}
目录
相关文章
【LeetCode】BM1 反转链表、NC21 链表内指定区间反转
BM1 反转链表 描述: 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。
51 0
|
算法 安全 Swift
LeetCode - #56 合并区间(Top 100)
不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。如果大家有建议和意见欢迎在文末留言,我们会尽力满足大家的需求。
|
算法 程序员
【牛客算法BM2】 链表内指定区间反转
你好,欢迎来到我的博客!作为一名程序员,我经常刷LeetCode题目来提升自己的编程能力。在我的博客里,我会分享一些我自己做过的题目和解题思路,希望能够帮助到大家。今天,我想和大家分享一道挑战性较高的题目,让我们一起来挑战一下吧!作者也是在学习的过程中刷到有意思的题目就会选择与大家分享,并且提供较优解,关于力扣 的文章全部放在博客,如果大家喜欢记得支持作者。🤓
AC牛客 BM4 合并两个排序的链表
AC牛客 BM4 合并两个排序的链表
95 0
AC牛客 BM4 合并两个排序的链表
AC牛客 BM3链表中的节点每k个一组翻转
AC牛客 BM3链表中的节点每k个一组翻转
82 0
AC牛客 BM3链表中的节点每k个一组翻转
AC Leetcode 763. 划分字母区间
AC Leetcode 763. 划分字母区间
93 0
AC Leetcode 763. 划分字母区间
|
存储 测试技术
牛客hot100--BM50---两数之和(简单难度)
牛客hot100--BM50---两数之和(简单难度)
133 0
牛客hot100--BM50---两数之和(简单难度)
|
测试技术
牛客hot100--BM17---二分查找I(简单难度)
牛客hot100--BM17---二分查找I(简单难度)
120 0
牛客hot100--BM17---二分查找I(简单难度)
牛客hot100--BM88---判断是否为回文字符串(入门难度)
牛客hot100--BM88---判断是否为回文字符串(入门难度)
95 0
牛客hot100--BM88---判断是否为回文字符串(入门难度)
牛客hot100--BM6---判断链表中是否有环(简单难度)
牛客hot100--BM6---判断链表中是否有环(简单难度)
132 0
牛客hot100--BM6---判断链表中是否有环(简单难度)