LeetCode题练习与总结:将数据流变为多个不相交区间--352

一、题目描述

 给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。

实现 SummaryRanges 类:

  • SummaryRanges() 使用一个空数据流初始化对象。
  • void addNum(int val) 向数据流中加入整数 val 。
  • int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。

示例:

输入:
["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"]
[[], [1], [], [3], [], [7], [], [2], [], [6], []]
输出:
[null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]]解释:
SummaryRanges summaryRanges = new SummaryRanges();
summaryRanges.addNum(1);      // arr = [1]
summaryRanges.getIntervals(); // 返回 [[1, 1]]
summaryRanges.addNum(3);      // arr = [1, 3]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]]
summaryRanges.addNum(7);      // arr = [1, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]]
summaryRanges.addNum(2);      // arr = [1, 2, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]]
summaryRanges.addNum(6);      // arr = [1, 2, 3, 6, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]

提示:

  • 0 <= val <= 10^4
  • 最多调用 addNum 和 getIntervals 方法 3 * 10^4 次

二、解题思路

  1. 在查找可以合并的区间时,我们使用while循环来找到第一个结束位置小于val的区间,并记录其索引i
  2. 接下来,我们检查左边区间是否可以合并,即左区间结束位置加一等于val
  3. 我们也检查右边区间是否可以合并,即右区间开始位置减一等于val
  4. 如果两个条件都满足,说明可以同时合并左边和右边区间,我们需要合并这两个区间,并从列表中移除右边的区间。
  5. 如果只有一个条件满足,则不需要进行额外的操作,因为已经通过上面的步骤合并了区间。
  6. 如果两个条件都不满足,说明val是一个新的区间,我们需要在索引i的位置插入新的区间。

三、具体代码

import java.util.ArrayList;
import java.util.List;public class SummaryRanges {List<int[]> intervals;boolean[] added;public SummaryRanges() {intervals = new ArrayList<>();added = new boolean[10001]; // 因为题目中提示 0 < val < 10^4}public void addNum(int val) {if (added[val]) return; // 如果数字已经添加过,直接返回added[val] = true;// 查找可以合并的区间int i = 0;while (i < intervals.size() && intervals.get(i)[1] < val) {i++;}// 尝试合并区间boolean leftMerged = false, rightMerged = false;if (i > 0 && intervals.get(i - 1)[1] + 1 == val) {intervals.get(i - 1)[1] = val;leftMerged = true;}if (i < intervals.size() && intervals.get(i)[0] - 1 == val) {intervals.get(i)[0] = val;rightMerged = true;}if (leftMerged && rightMerged) {// 合并两个区间intervals.get(i - 1)[1] = intervals.get(i)[1];intervals.remove(i);} else if (!leftMerged && !rightMerged) {// 如果没有合并到任何区间,则新增一个区间intervals.add(i, new int[]{val, val});}}public int[][] getIntervals() {return intervals.toArray(new int[0][]);}
}

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

1. 时间复杂度
  • addNum(int val) 方法的时间复杂度:

    • added[val] 的访问是常数时间操作,复杂度为 O(1)。
    • while 循环在最坏情况下会遍历整个 intervals 列表,复杂度为 O(n),其中 n 是 intervals 列表的长度。
    • 合并区间的操作(包括检查和可能的合并)是常数时间操作,复杂度为 O(1)。
    • intervals.remove(i) 的操作在最坏情况下是 O(n),因为可能需要移动元素。
    • intervals.add(i, new int[]{val, val}) 的操作在最坏情况下也是 O(n),因为可能需要移动元素。
    • 综合以上,addNum 方法的时间复杂度是 O(n)。
  • getIntervals() 方法的时间复杂度:

    • toArray 方法的时间复杂度是 O(n),其中 n 是 intervals 列表的长度。
    • 因此,getIntervals() 方法的时间复杂度也是 O(n)。

整体来看,该代码的时间复杂度主要取决于 addNum 方法,为 O(n)。

2. 空间复杂度
  • intervals 列表的空间复杂度是 O(n),其中 n 是区间列表中元素的数量。
  • added 数组的空间复杂度是 O(1),因为其大小是固定的,为 10001。

综合以上,该代码的整体空间复杂度是 O(n + 1),可以简化为 O(n),其中 n 是区间列表中元素的数量。

五、总结知识点

  • 类定义

    • public class SummaryRanges:定义了一个公共类SummaryRanges
  • 成员变量

    • List<int[]> intervals:定义了一个列表,用于存储区间,其中每个区间是一个整型数组。
    • boolean[] added:定义了一个布尔数组,用于跟踪某个值是否已经被添加到区间中。
  • 构造方法

    • public SummaryRanges():类的构造方法,用于初始化成员变量。
  • 方法定义

    • public void addNum(int val):定义了一个公共方法addNum,用于添加一个新数字到区间集合中。
    • public int[][] getIntervals():定义了一个公共方法getIntervals,用于获取当前所有区间的二维数组。
  • 条件语句

    • if (added[val]) return;:使用了条件语句来检查是否已经添加过该值,如果是则直接返回。
  • 循环结构

    • while (i < intervals.size() && intervals.get(i)[1] < val):使用while循环来查找可能合并的区间。
  • 逻辑运算

    • leftMerged = true 和 rightMerged = true:使用了布尔变量来跟踪是否发生了区间合并。
  • 数组操作

    • intervals.get(i - 1)[1] = val:通过索引直接修改数组中的元素。
    • intervals.remove(i):从列表中移除指定索引的元素。
    • intervals.add(i, new int[]{val, val}):向列表中的指定位置添加新元素。
  • 列表操作

    • intervals.toArray(new int[0][]):将列表转换为数组。
  • 数据结构

    • ArrayList:使用了ArrayList来存储区间列表。
    • int[]:使用了整型数组来表示区间。
  • 内存管理

    • boolean[] added:使用固定大小的布尔数组来跟踪添加的状态,这是一种空间换时间的做法。
  • 边界条件处理

    • 代码中处理了多种边界条件,如新数字是否可以合并到现有区间的前面或后面,以及是否需要合并两个相邻区间。

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

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

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

相关文章

iOS Swift5算法恢复——HMAC

demangle的时候看到了CryptoSwift&#xff0c;HMAC&#xff0c;于是写一个helloworld&#xff0c;用于对照。 sudo gem install cocoapods pod init pods文件&#xff0c;注意要标注静态链接&#xff1a; # Uncomment the next line to define a global platform for your p…

Diving into the HAL-----HAL_GPIO

1、怎么看待外设&#xff1a; 从总线连接的角度看&#xff0c;外设和Core、DMA通过总线交换数据&#xff0c;正所谓要想富先修路。要注意&#xff0c;这些总线中的每一个都连接到不同的时钟源&#xff0c;这些时钟源决定了连接到该总线的外设操作的最大速度。 从内存分配的角度…

C#与C++交互开发系列(十六):使用多线程

前言 在开发需要高性能的应用程序时&#xff0c;多线程是提升处理效率和响应速度的关键技术。C 和 C# 各自拥有不同的线程模型和并发工具。在跨语言开发中&#xff0c;如何有效地利用两者的并发特性&#xff0c;同时确保线程安全和数据一致性&#xff0c;是一个值得探讨的问题…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后&#xff0c;找不到ffmpeg中的一个文件 产生原因&#xff0c;各种包集成&#xff0c;然后安装以后乱七八糟&#xff0c;甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

查询使用方法:

模糊查询&#xff1a; 查询某一列中内容为空的记录。 -- 模糊查询 (项目中尽量不要使用) -- 张x SELECT * FROM student WHERE student_name LIKE 张_; -- % 不限长度的字符 -- 手机号中有 23 0或多个 SELECT * FROM student WHERE phone LIKE %23% -- 名字包含铮的学生 SELEC…

数据结构与算法分析——你真的理解查找算法吗——基于散列的查找(代码详解+万字长文)

一、算法描述 前面讨论的查找算法在处理小数据量(顺序查找)或者有序的数据集合(二分查找)时才使用。我们需要更加强大的算法能够查找较大的集合,而且并不需要有序。最常使用的一个方法是使用散列函数来将目标元素的一个或者多个特征转换成一个值,这个值用来索引一个已经索引的…

密码管理工具实现

该文档详细描述了实现一个简单的密码管理工具的过程&#xff0c;工具基于PHP和MySQL构建&#xff0c;支持用户注册、密码存储、管理以及角色权限控制等核心功能。 系统架构设计 技术栈&#xff1a;PHP&#xff08;后端逻辑&#xff09;、MySQL&#xff08;数据存储&#xff09…

深度学习(七)深度强化学习:融合创新的智能之路(7/10)

一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术&#xff0c;在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力&#xff0c;能够处理复杂的任务和环境。例如…

基于 Java 的 Spring Boot 和 Vue 的宠物领养系统设计与实现

需要代码 vx&#xff1a;Java980320 不收取任何费用 在这个宠物领养系统中&#xff0c;我们可以设定两个角色&#xff1a;管理员和普通用户。每个角色的功能和目标略有不同&#xff0c;以下分别介绍&#xff1a; 管理员 管理员的主要职责是确保平台的高效运行&#xff0c…

PythonBase01

将理论&#xff0c;代码&#xff0c;图示三合一。 day1计算机基础结构 硬件 1944年&#xff0c;美籍匈牙利数学家冯诺依曼提出计算机基本结构。 五大组成部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备。 – 运算器&#xff1a;按照程序中的指令&#xff0c…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户&#xff0c;有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务&#xff0c;实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine&#xff08;推荐版本…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用&#xff1f;小结&#xff1a;同步调用优缺点 1-2 异步调用什么是异步调用&#xff1f;小结&#xff1a;异步调用的优缺点&#xff0c;什么时候使用异步调用&#xff1f; 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等&#xff0c;测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了&#xff0c;于是想用商汤的mmclassification快速搞一波&#xff0c;发现已…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

太速科技-430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡

430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡 一、板卡概述 板卡使用Xilinx的第三代RFSOC系列&#xff0c;单颗芯片包含8路ADC和DAC&#xff0c;64-bit Cortex A53系列4核CPU&#xff0c;Cortex-R5F实时处理核&#xff0c;以及大容量FPGA。 对主机接口采用PCIe Gen3x…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 &#xff0c;ASM实例不能mount。 Oracle数据库故障分析&恢复方案&#xff1a; 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…

深度学习Pytorch-Tensor的属性、算术运算

深度学习Pytorch-Tensor的属性、算术运算 Tensor的属性Tensor的算术运算Pytorch中的in-place操作Pytorch中的广播机制Tensor的取整/取余运算Tensor的比较运算Tensor的取前k个大/前k小/第k小的数值及其索引Tensor判定是否为finite/inf/nan Tensor的属性 每一个Tensor对象都有以…

vue 果蔬识别系统百度AI识别vue+springboot java开发、elementui+ echarts+ vant开发

编号&#xff1a;R03-果蔬识别系统 简介&#xff1a;vuespringboot百度AI实现的果蔬识别系统 版本&#xff1a;2025版 视频介绍&#xff1a; vuespringboot百度AI实现的果蔬识别系统前后端java开发&#xff0c;百度识别&#xff0c;带H5移动端&#xff0c;mysql数据库可视化 1 …