LeetCode题练习与总结:合并区间--56

news2024/12/23 10:15:22

一、题目描述

示例 1:

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

二、解题思路

  1. 对区间数组 intervals 按起始点进行排序。
  2. 初始化两个指针,一个用于遍历区间 i,另一个用于记录合并后的区间的开始位置 j
  3. 创建一个新的 List 来存储合并后的区间,这样可以动态地添加新的区间而不用担心数组越界的问题。
  4. 遍历排序后的区间,比较当前区间与上一个区间是否有重叠。
  5. 如果有重叠,更新上一个区间的结束点为当前区间结束点和上一个区间结束点的最大值。
  6. 如果没有重叠,将上一个区间添加到结果列表中,并将当前区间作为新的区间。
  7. 遍历结束后,将最后一个区间也添加到结果列表中。
  8. 将结果列表转换为二维数组并返回。

三、具体代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals == null || intervals.length < 2) {
            return intervals;
        }

        // Sort the intervals by the start point
        Arrays.sort(intervals, (a, b) -> a[0] - b[0]);

        List<int[]> mergedIntervals = new ArrayList<>();
        int i = 0;

        // Iterate through the intervals
        while (i < intervals.length) {
            int start = intervals[i][0];
            int end = intervals[i][1];
            int j = i + 1;

            // Merge overlapping intervals
            while (j < intervals.length && intervals[j][0] <= end) {
                end = Math.max(end, intervals[j][1]);
                j++;
            }

            // Add the merged interval to the list
            mergedIntervals.add(new int[]{start, end});
            i = j;
        }

        // Convert the list of intervals to a 2D array
        int[][] result = new int[mergedIntervals.size()][2];
        for (int k = 0; k < mergedIntervals.size(); k++) {
            result[k] = mergedIntervals.get(k);
        }

        return result;
    }
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 对区间进行排序:O(n log n),其中 n 是区间的数量。这是因为 Arrays.sort 使用的是双轴快速排序算法,其时间复杂度为 O(n log n)
  • 遍历和合并区间:O(n)。在最坏的情况下,每个区间都与其他区间重叠,因此我们需要遍历所有的区间,但是每个区间只被处理一次,所以这部分的时间复杂度是线性的。
  • List 转换为二维数组:O(k),其中 k 是合并后的区间数量。这通常小于等于原始区间的数量 n
  • 综上所述,总的时间复杂度是 O(n log n) + O(n) + O(k),由于 k 通常小于 n,所以主要的时间复杂度贡献是 O(n log n)
2. 空间复杂度
  • 存储排序后的区间:O(n),因为我们需要存储所有的原始区间。
  • 存储合并后的区间:O(k),其中 k 是合并后的区间数量。在最坏的情况下,所有的区间都重叠,合并后的区间数量为1,这时空间复杂度为 O(n)。在最好的情况下,没有重叠的区间,合并后的区间数量等于原始区间的数量,这时空间复杂度也是 O(n)
  • 因此,总的空间复杂度是 O(n) + O(k),主要的空间复杂度贡献是 O(n)

五、总结知识点

  1. 数组排序 (Arrays.sort): 使用Java标准库中的 Arrays.sort 方法对区间数组按照起始点进行排序。这是合并重叠区间的前提,因为只有排序后才能正确地识别和处理重叠的区间。

  2. Lambda表达式: 在排序方法中使用了Lambda表达式 (a, b) -> a[0] - b[0] 作为比较器(Comparator),它比较两个区间的起始点,用于排序。

  3. ArrayList: 使用 ArrayList 来动态存储合并后的区间。由于合并过程中可能减少区间的数量,使用动态数组可以避免在编译时确定数组大小,从而提高代码的灵活性。

  4. 循环控制: 代码中使用了 while 循环来遍历和合并区间。通过两个嵌套的循环(外循环遍历所有区间,内循环合并重叠区间)来实现合并逻辑。

  5. 条件判断: 在内循环中,使用条件判断 intervals[j][0] <= end 来检查当前区间是否与已合并区间重叠。

  6. 数学运算 (Math.max): 使用 Math.max 函数来获取两个区间结束点的最大值,这是合并区间时确定新区间结束点的方法。

  7. 数组和集合的转换: 最后,代码将 ArrayList 转换为二维数组。这是为了满足题目要求的输出格式,同时也是Java中常见的数据结构转换操作。

  8. 边界检查: 在合并区间的过程中,代码通过检查 j < intervals.length 来避免数组越界异常。

  9. 返回值处理: 如果输入的区间数组为空或者只包含一个区间,直接返回原数组,这是处理边界情况的一种简单有效的方法。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1571382.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springCloudAlibaba集成gateWay实战(详解)

一、初识网关&#xff1f; 1、网关介绍 ​ 在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话…

我与C++的爱恋:类与对象(一)

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&…

【每日力扣】198.打家劫舍与213.打家劫舍II与337.打家劫舍 III

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 198.打家劫舍 力扣题目链接(opens new window) 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&…

谷歌AI搜索革新:探索高级搜索服务背后的未来趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Redis -- 缓存穿透问题解决思路

缓存穿透 &#xff1a;缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。 常见的解决方案有两种&#xff1a; 缓存空对象 优点&#xff1a;实现简单&#xff0c;维护方便 缺点&#xff1a; 额外…

STM32之HAL开发——不同系列SPI功能对比(附STM32Cube配置)

不同系列STM32——SPI框图 F1系列框图 F4系列框图 TI模式时序图特性 F7系列框图 H7系列框图 注意&#xff1a;F7系列以及H7系列支持Quad-SPI模式&#xff0c;可以连接单&#xff0c;双或者四条数据线的Flash存储介质。 SPI——Cube配置流程 RCC时钟源配置 SYS系统调试模式配…

【SCI绘图】【箱型图系列1 python】多类对比及各类下属子类对比

SCI&#xff0c;CCF&#xff0c;EI及核心期刊绘图宝典&#xff0c;爆款持续更新&#xff0c;助力科研&#xff01; 本期分享&#xff1a; 【SCI绘图】【箱型图系列1】多类对比各类下属子类对比 文末附带完整代码&#xff1a; 1.环境准备 python 3 from matplotlib import p…

Go语言hash/fnv应用实战:技巧、示例与最佳实践

Go语言hash/fnv应用实战&#xff1a;技巧、示例与最佳实践 引言hash/fnv概览使用hash/fnv的初步步骤导入hash/fnv库创建哈希器实例 hash/fnv在实际开发中的应用生成唯一标识符数据分片与负载均衡快速查找 高级技巧和最佳实践避免哈希碰撞动态调整哈希表大小利用sync.Pool优化哈…

【蓝桥杯】GCD与LCM

一.概述 最大公约数&#xff08;GCD&#xff09;和最小公倍数&#xff08;Least Common Multiple&#xff0c;LCM&#xff09; 在C中&#xff0c;可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

HTML5动画设计工具 Hype 4 Pro v4.1.14中文激活版

Hype Pro是一款功能丰富、易用且灵活的HTML5动画设计工具&#xff0c;适用于设计师、开发者和创作者创建各种精美的交互式网页动画。它的强大功能和可视化编辑界面使用户能够快速而轻松地实现复杂的动画效果&#xff0c;同时支持多种输出格式和交互方式&#xff0c;满足用户对网…

内网安全之-kerberos协议

kerberos协议是由麻省理工学院提出的一种网络身份验证协议&#xff0c;提供了一种在开放的非安全网络中认证识别用户身份信息的方法。它旨在通过使用秘钥加密技术为客户端/服务端应用提供强身份验证&#xff0c;使用kerberos这个名字是因为需要三方的共同参与才能完成一次认证流…

中科驭数DPU技术开放日秀“肌肉”:云原生网络、RDMA、安全加速、低延时网络等方案组团亮相

2024年3月29日&#xff0c;中科驭数以“DPU构建高性能云算力底座”为主题的线上技术开放日活动成功举办。在开放日上&#xff0c;中科驭数集中展现了其在低时延网络、云原生网络及智算中心网络三大关键场景下的技术成果与五大核心DPU解决方案&#xff0c;凸显了中科驭数在高性能…

RDD算子(四)、血缘关系、持久化

1. foreach 分布式遍历每一个元素&#xff0c;调用指定函数 val rdd sc.makeRDD(List(1, 2, 3, 4)) rdd.foreach(println) 结果是随机的&#xff0c;因为foreach是在每一个Executor端并发执行&#xff0c;所以顺序是不确定的。如果采集collect之后再调用foreach打印&#xf…

使用CSS计数器,在目录名称前加上了序号,让目录看起来更加井然有序

目录&#xff08;Text of Contents缩写为TOC&#xff09;&#xff0c;其实就是一篇文章的概要或简述。这好比&#xff0c;去书店买书&#xff0c;先是被这本书的标题所吸引&#xff0c;而后我们才会&#xff0c;翻开这本书目录&#xff0c;看看这本书主要是在讲些什么&#xff…

Claude 3 on Amazon Bedrock 结合多智能体助力 Altrubook AI 定义消费者 AI 新范式

关于 Altrubook AI 智能消费决策机器人 Altrubook 是全球首创场景化智能决策机器人&#xff0c;由国内外大厂等前员工共同研发&#xff0c;具有定制化 IP 决策机器人、沉浸式购物体验和需求匹配优化等独特优势。目前&#xff0c;Altrubook AI 已完成与 Claude 3 on Amazon Bedr…

【深度优先】【树上倍增 】2846. 边权重均等查询

本文涉及知识点 深度优先 树上倍增 LeetCode2846. 边权重均等查询 现有一棵由 n 个节点组成的无向树&#xff0c;节点按从 0 到 n - 1 编号。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi, wi] 表示树中存在一条位于节点 ui…

备战蓝桥杯---贡献法刷题

话不多说&#xff0c;直接看题&#xff1a; 什么是贡献法&#xff1f;这是一种数学思想&#xff0c;就是看每一个元素对总和的贡献。 1. 我们可以先枚举区间再统计次数&#xff0c;但这显然TLE。我们可以发现&#xff0c;每一个孤独的区间对应一个孤独的牛&#xff0c;因此我…

注意力机制篇 | YOLOv8改进之添加多尺度全局注意力机制DilateFormer(MSDA)| 即插即用

前言:Hello大家好,我是小哥谈。多尺度全局注意力机制DilateFormer是一种用图像识别任务的深度学习模型。它是在Transformer模型的基础上进行改进的,旨在提高模型对图像中不同尺度信息的感知能力。DilateFormer引入了多尺度卷积和全局注意力机制来实现多尺度感知。具体来说,…

考古:IT架构演进之IOE架构

考古&#xff1a;IT架构演进之IOE架构 IOE架构&#xff08;IBM, Oracle, EMC&#xff09;出现在20世纪末至21世纪初&#xff0c;是一种典型的集中式架构体系。在这个阶段&#xff0c;企业的关键业务系统往往依赖于IBM的小型机&#xff08;后来还包括大型机&#xff09;、Oracle…

题库管理系统-基于Springboot实现JAVA+SQL离散数学题库管理系统(完整源码+LW+翻译)

基于Springboot实现JAVASQL离散数学题库管理系统(完整源码LW翻译) 概述&#xff1a; 本系统具体完成的功能如下&#xff1a; 1题库的管理与维护&#xff1a;新题的录入&#xff0c;修改&#xff0c;删除等功能。 2生成试卷&#xff1a;包括自动生成与手工改动&#xff0c;要…