LeetCode题练习与总结:最大间距--164

一、题目描述

给定一个无序的数组 nums,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0 。

您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。

示例 1:

输入: nums = [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。

示例 2:

输入: nums = [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。

提示:

  • 1 <= nums.length <= 10^5
  • 0 <= nums[i] <= 10^9

二、解题思路

  1. 确定桶的大小:首先找出数组中的最大值和最小值,计算出差值。这个差值将用于确定桶的大小。每个桶的容量是(最大值 - 最小值) / (数组长度 - 1)

  2. 创建桶:根据上述计算出的桶大小,创建足够的桶。每个桶只存储该区间内的最大值和最小值。

  3. 分配数字到桶中:遍历数组,将每个数字分配到相应的桶中。对于每个桶,只需要记录该桶内的最大值和最小值,因为最大差值只可能出现在相邻桶之间。

  4. 找出最大差值:遍历桶,计算相邻非空桶之间的最小值之差,最大的那个差值就是答案。

三、具体代码

class Solution {public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) {return 0;}int min = nums[0];int max = nums[0];for (int num : nums) {min = Math.min(min, num);max = Math.max(max, num);}int bucketSize = Math.max(1, (max - min) / (nums.length - 1));int bucketCount = (max - min) / bucketSize + 1;int[] bucketMin = new int[bucketCount];int[] bucketMax = new int[bucketCount];Arrays.fill(bucketMin, Integer.MAX_VALUE);Arrays.fill(bucketMax, Integer.MIN_VALUE);for (int num : nums) {int index = (num - min) / bucketSize;bucketMin[index] = Math.min(bucketMin[index], num);bucketMax[index] = Math.max(bucketMax[index], num);}int maxGap = 0;int previousMax = bucketMax[0];for (int i = 1; i < bucketCount; i++) {if (bucketMin[i] != Integer.MAX_VALUE) {maxGap = Math.max(maxGap, bucketMin[i] - previousMax);previousMax = bucketMax[i];}}return maxGap;}
}

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

1. 时间复杂度
  • 遍历数组以找到最大值和最小值:这一步的时间复杂度是O(n),其中n是数组的长度,因为我们需要遍历整个数组一次。

  • 初始化桶:初始化桶的时间复杂度是O(1),因为桶的数量与数组的长度成线性关系,但是这个操作是常数时间的。

  • 分配数字到桶中:这一步的时间复杂度也是O(n),因为我们再次遍历数组,并将每个元素放入相应的桶中。每个操作是常数时间的。

  • 找出最大差值:这一步的时间复杂度是O(m),其中m是桶的数量。在最坏的情况下,m可以接近n,但是通常情况下,m会远小于n,因为桶的大小是由数组的长度决定的。

综上所述,整个算法的时间复杂度是O(n),因为所有的步骤都是线性的,没有步骤会超过O(n)的时间复杂度。

2. 空间复杂度
  • 桶数组:我们需要两个数组来存储每个桶的最小值和最大值,这两个数组的长度与桶的数量相同。在最坏的情况下,桶的数量可以接近数组的长度n,因此空间复杂度是O(n)。

  • 其他变量:除了桶数组之外,我们只使用了几个额外的变量来存储最小值、最大值、桶大小等,这些变量的空间占用是常数的,因此可以忽略不计。

综合以上分析,整个算法的空间复杂度是O(n),因为我们需要存储每个桶的最小值和最大值,这需要与数组长度成线性关系的额外空间。

五、总结知识点

  1. 线性时间复杂度算法设计:代码的核心在于寻找一个线性时间复杂度的算法来解决问题,这是通过对数组进行一次遍历来实现的。

  2. 桶排序(Bucket Sort):虽然代码并不是为了对数组进行完全排序,但是它使用了桶排序的思想。桶排序是一种将元素分配到有限数量的桶中,然后对每个桶进行单独排序的算法。在这个问题中,我们只关心每个桶的最大值和最小值,因为最大差值只能出现在相邻桶之间。

  3. 空间换时间:通过使用额外的空间(桶数组)来减少时间复杂度。这是一种常见的编程技巧,在不能牺牲时间复杂度的场合特别有用。

  4. 数组操作:代码中使用了数组的填充(Arrays.fill)和遍历等基本操作。

  5. 数学计算:计算桶的大小和数量涉及到基本的数学运算,如除法和加法。

  6. 边界条件处理:代码首先检查输入数组的长度,如果长度小于2,则直接返回0,这是因为长度小于2的数组不存在相邻元素。

  7. 最小值和最大值的初始化:在遍历数组之前,将最小值和最大值初始化为数组的第一个元素,这是一种常见的初始化技巧。

  8. 遍历和比较:代码中多次使用遍历和比较操作来找到最小值、最大值以及最大差值。

  9. 整数除法:在计算桶的大小时,使用了整数除法,这会向下取整,确保每个桶的大小合适。

  10. 无穷大和无穷小值的处理:使用Integer.MAX_VALUEInteger.MIN_VALUE来初始化桶的最小值和最大值,这是一种常见的做法,以便在后续的比较中正确地识别出桶中的实际最小值和最大值。

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

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

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

相关文章

微软研发致胜策略 01:尊定基础

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1994 年发布。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Debugging the Development Process》&#xff0c;这本书详细阐述了软件开发过程中的常见问题及其解决方案&a…

Docker安装Zookeeper、RocketMQ

安装Zookeeper 拉取镜像 docker pull zookeeper:3.9.2启动容器 -d后台启动&#xff0c;-p映射容器2181端口到宿主机2181端口&#xff0c;限制容器最大内存占用为128m&#xff0c;–restart容器自动重启 docker run -d -p 2181:2181 -m 128m --restartalways --name zookeepe…

特征映射(机器学习)

有时数据的分类并不像我们想象的那么简单&#xff0c;需要高次曲线才能分类。 就像下面的数据&#xff1a; 数据集最后给出&#xff1a; 我们这样看&#xff0c;至少需要达到2次以及以上的曲线才可以进行比较准确的分类。 比如如果已知数据有3列(两列特征) x1x2y-1-110.50.…

Axolotl

文章目录 一、关于 Axolotl特点Axolotl支持 二、快速入门⚡用法 三、环境设置1、Docker2、Conda/Pip venv3、Cloud GPU4、Bare Metal Cloud GPULambdaLabsGCP 5、Windows6、Mac7、Google Colab8、通过SkyPilot在公共云上启动9、通过 dstack 在公共云上启动 四、其他高级设置1、…

网站成长时间轴页面,网站发展记录页源码

一、源码描述 这是一款网站时间轴HTML源码&#xff0c;样式设计精美并且使用简单&#xff0c;主要用于记录你的网站发展历程&#xff0c;或者可以用于发布心情动态等&#xff0c;左侧年份可以折叠起来&#xff0c;页面底部是导航区域&#xff0c;可以自定义文本和链接。 二、…

Azure Repos 仓库管理

从远端仓库克隆到本地 前提:本地要安装git,并且登录了账户 1.在要放这个远程仓库的路径下,打git 然后 git clone https://.. 如果要登录验证,那就验证下 克隆完后,cd 到克隆的路径, 可以用 git branch -a //查看分支名 git status //查看代码状态 删除…

Shell基础之流程循环控制语句

目录 for循环 带列表循环 不带列表循环 类C风格循环 while循环 语法 无限循环 使用示例 until循环 基本语法 示例 select循环 语法格式 嵌套循环 break和continue break的使用 continue的使用 在shell 中循环有以下几种&#xff1a; for 循环 while …

对于GPT-5在一年半后发布的期待!

首先&#xff0c;如果GPT-5真如OpenAI首席技术官米拉穆拉蒂&#xff08;Mira Murati&#xff09;在采访中所透露的那样&#xff0c;在一年半后发布&#xff0c;并在某些领域达到博士级的智能&#xff0c;这无疑将是一个令人振奋的消息。这一预测不仅反映了AI技术的快速发展&…

MPAS跨尺度、可变分辨率模式实践技术

跨尺度预测模式&#xff08;The Model for Prediction Across Scales - MPAS&#xff09;是由洛斯阿拉莫斯实验室和美国国家大气研究中心(NCAR)共同开发&#xff0c;其由3个部分组成&#xff0c;分别称为 MPAS-A&#xff08;大气模型&#xff09;、MPAS-O&#xff08;海洋模型&…

python实例练习00001:打开文件输出文件内容

try:file input(enter the file :)with open(file, r) as f:data f.read()print(data) except FileNotFoundError:print(fthe file {file} does not exists:) 打开windows的cmd运行程序&#xff0c;效果如下&#xff1a;

MyBatis-Plus字段类型处理器介绍以及使用

文章目录 前言自定义 TypeHandler1. 创建 TypeHandler 类2. 注册自定义 TypeHandler2.1. 在 MyBatis XML 配置文件中注册&#xff1a;2.2. 在 Spring Boot 中注册&#xff1a;2.3. 在 Spring Boot配置文件注册&#xff1a; 3. 使用 TypeHandler3.1 在实体类属性上使用3.2 在 XM…

vscode常用组件

1.vue-helper 启用后点击右下角注册&#xff0c;可以通过vue组件点击到源码里面 2.【Auto Close Tag】和【Auto Rename Tag】 3.setting---Auto Reveal Exclude vscode跳转node_modules下文件&#xff0c;没有切换定位到左侧菜单目录> 打开VSCode的setting配置&#xff…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会&#xff0c;安全问题愈发受到重视。随着科技的进步&#xff0c;非法闯入智能监测摄像机应运而生&#xff0c;成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能&#xff0c;还集成了智能识别和报警系统&#xff0c;能够在第一时间内检测到潜在的入侵行…

xxs攻击的攻击和防范

随着互联网技术的飞速发展&#xff0c;网络安全问题日益凸显。跨站脚本攻击&#xff08;XSS 攻击&#xff09;作为一种常见的网络攻击手段&#xff0c;给网络应用和用户数据安全带来了严重威胁。本文深入探讨了 XSS 攻击的原理、分类、危害以及相应的防范措施&#xff0c;旨在提…

第七天 SpringBoot与SpringCloud微服务项目交付

Spring Cloud微服务项目交付 微服务扫盲篇 微服务并没有一个官方的定义&#xff0c;想要直接描述微服务比较困难&#xff0c;我们可以通过对比传统WEB应用&#xff0c;来理解什么是微服务。 单体应用架构 如下是传统打车软件架构图&#xff1a; 这种单体应用比较适合于小项…

图像处理中的Scharr算子的原理,并附OpenCV和MATLAB示例代码

Scharr算子是图像处理中的一种边缘检测算子&#xff0c;主要用于计算图像梯度的边缘检测。与Sobel算子类似&#xff0c;Scharr算子也使用卷积核来计算图像的导数&#xff0c;但Scharr算子在精度和抗噪性方面表现更优。其原理如下&#xff1a; 原理 梯度计算 在图像处理中&…

服务器数据恢复—raid5阵列热备盘同步失败导致lun不可用的数据恢复案例

服务器存储数据恢复环境&#xff1a; 华为S5300存储中有一组由16块FC硬盘组建的RAID5磁盘阵列&#xff08;包含一块热备盘&#xff09;。 服务器存储故障&#xff1a; 该存储中的RAID5阵列1块硬盘由于未知原因离线&#xff0c;热备盘上线并开始同步数据&#xff0c;数据同步到…

Android C++系列:Linux文件系统(二)

1. VFS虚拟文件系统 Linux支持各种各样的文件系统格式&#xff0c;如ext2、ext3、reiserfs、FAT、NTFS、iso9660 等等&#xff0c;不同的磁盘分区、光盘或其它存储设备都有不同的文件系统格式&#xff0c;然而这些文件系统 都可以mount到某个目录下&#xff0c;使我们看到一个…

如何提升运维管理的精细化管理能力

在当今这个信息化的时代&#xff0c;运维管理已经成为企业IT架构中不可或缺的一环。随着企业业务的不断扩张和技术的日益复杂&#xff0c;提升运维管理的精细化管理能力显得尤为重要。精细化管理不仅能够提高企业的运营效率&#xff0c;还能有效降低运维成本&#xff0c;为企业…

最新PHP自助商城源码,彩虹商城源码

演示效果图 后台效果图 运行环境&#xff1a; Nginx 1.22.1 Mysql5.7 PHP7.4 直接访问域名即可安装 彩虹自助下单系统二次开发 拥有供货商系统 多余模板删除 保留一套商城,两套发卡 源码无后门隐患 已知存在的BUG修复 彩虹商城源码&#xff1a;下载 密码:chsc 免责声明&…