LeetCode[164]最大间距

news/2025/3/31 20:23:33/

难度:Hard

题目:

给定一个无序的数组 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 <= 105
  • 0 <= nums[i] <= 109

Related Topics

  • 数组
  • 桶排序
  • 基数排序
  • 排序

重点!!!解题思路

明确解题手段:题中要求使用线性的时间来解决这道题,想要排序这个数组,我们前面练习的排序方法时间复杂度都达不到此题的标准:

那么这道题我们来使用基数排序--基数排序科普:

源码+讲解:

    class Solution {public int maximumGap(int[] nums) {int[] temp = new int[nums.length];  //创建一个temp数组用于拷贝int[] cnt = new int[65536];  //65536 是因为这是 16 位二进制表示的所有可能值的数量,范围从 0 到 65535//低16位处理for (int x : nums) cnt[x & 0xffff] += 1;  //对每个数的低16位出现的次数进行处理for (int i = 1; i < 65536; i++) cnt[i] += cnt[i - 1];  //对cnt进行前缀和处理for (int i = nums.length - 1; i >= 0; i--) temp[--cnt[nums[i] & 0xffff]] = nums[i];  //需要从后向前遍历保证基数排序的稳定性,这样前缀和的值所对应的就是当前元素应该在的下标位置//初始化Arrays.fill(cnt, 0);  //对高16位进行处理前,需要初始化cnt数组//高16位处理for (int x : temp) cnt[(x & 0xffff0000) >> 16] += 1;  //现在是对刚才排好序的temp进行高16位处理for (int i = 1; i < 65536; i++) cnt[i] += cnt[i - 1];for (int i = temp.length - 1; i >= 0; i--) nums[--cnt[(temp[i] & 0xffff0000) >> 16]] = temp[i];//结果处理int ans = 0;for (int i = 1; i < nums.length; i++) ans = Math.max(ans, nums[i] - nums[i - 1]);return ans;}}

运行结果:

如果您还有什么疑问或解答有问题,可在下方评论,我会及时回复。

系列持续更新中,点个订阅吧,喜欢练习算法那就点个攒吧 


http://www.ppmy.cn/news/1027607.html

相关文章

【算法基础19-模拟队列】

模拟队列 算法示意图 算法的伪代码 例题 实现一个队列&#xff0c;队列初始为空&#xff0c;支持四种操作&#xff1a; push x – 向队尾插入一个数 x&#xff1b;pop – 从队头弹出一个数&#xff1b;empty – 判断队列是否为空&#xff1b;query – 查询队头元素。 现在要…

第一章:计算机与编程导论

1.1引言 如何解决问题&#xff1a;通过一组精确陈述的指令来设计问题的解决方案。 程序&#xff1a;一组指令以计算机可以接收和执行的格式描述时。 例如&#xff1a;百货商店管理&#xff0c;编写一套指令&#xff0c;在商品购进和售出时对其跟踪。如果这些指令是正确的&…

华为OD真题--新学习选址--带答案

2023华为OD统一考试&#xff08;AB卷&#xff09;题库清单-带答案&#xff08;持续更新&#xff09;or2023年华为OD真题机考题库大全-带答案&#xff08;持续更新&#xff09; 为了解新学期学生暴涨的问题,小乐村要建立所新学校 考虑到学生上学安全问题,需要所有学生家到学校的…

QGIS3.28的二次开发七:创建地图工具

地图工具是输入设备&#xff08;一般指鼠标与键盘&#xff09;与画布&#xff08;QgsMapCanvas&#xff09;的交互接口。它负责处理所有用户通过输入设备&#xff08;鼠标和键盘&#xff09;和画布互动的操作&#xff0c;例如镜头控制、要素绘制、标识工具等。 QgsMapTool 是地…

Spannable配合AnimationDrawable实现TextView中展示Gif图片

辣的原理解释&#xff0c;反正大家也不爱看&#xff0c;所以直接上代码了 长这样&#xff0c;下面两个图是gif&#xff0c;会动的。 package com.example.myapplication;import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable…

Linux 终端命令之文件浏览(2) more

Linux 文件浏览命令 cat, more, less, head, tail&#xff0c;此五个文件浏览类的命令皆为外部命令。 hannHannYang:~$ which cat /usr/bin/cat hannHannYang:~$ which more /usr/bin/more hannHannYang:~$ which less /usr/bin/less hannHannYang:~$ which head /usr/bin/he…

c语言——斐波那契数列应用

//斐波那契数列应用 #include<stdio.h> int main() {int i,n,t10,t21,nextTerm;printf("输出项目数&#xff1a;");scanf("%d",&n);printf("斐波那契数列应用&#xff1a;");for(i1;i<n;i){printf("%d、",t1);nextTermt1…

RTT(RT-Thread)线程间同步(保姆级)

目录 线程间同步 信号量 信号量结构体 信号量的使用和管理 动态创建信号量 实例 静态创建信号量 初始化和脱离信号量 获取信号量 信号量的互斥操作 获取信号量函数 释放信号量 信号量同步实例 互斥量&#xff08;互斥锁&#xff09; 互斥量的使用和管理 动态创…