

求无序数组排序后相邻俩数最大差值(思路及详解)
source link: https://zxs.io/article/992
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前两天在一个学长面试的时候遇到这样一个题,这里稍微详细说下本文的标题。给你n个任意整数,求排序后相邻两个数之间的最大差值,这里n可能有10^5,整数为任意32位整型。要求求解算法的时间复杂度为O(n)。
O(n)的时间复杂度,再加上任意32位整型,意味着我们没法用桶排序、计数排序等O(n)的排序算法(还记得这些算法吗!),当我看到这题的时候,我优先就排除了排序,也排除的桶排序,从此在错误的道路上越走越远,直到看了别人的题解。我这里再写一题解是因为别人的题解只有解决方法,没有思考过程。
回到题目, 首先说明一点,这题的大体思路就是桶排序,但是,不需要全部排序,只需要大体有序,其实就是每个桶内的数不需要有序,接下来我将解释为什么桶内的数不需要排序。
n个任意的数,划分到n个桶里。首先第一种情况,如果恰好每个桶都只有一个数,划分后不就恰好有序了吗,有序这道题不就好解决了吗! 另一种情况,在每个数数值范围非常大的时候也是很常见的,就是数不会均匀的落到每个桶中,这题的主要难点也在这。
如何解决? 想想看,在任意一个桶内任何情况下任意俩数的最大差值是多少,最大不就是桶的大小减一吗? 但是,在全局中肯定存在两个桶,后面一个桶的最小值和前一个桶的最大值差值大于桶大小,且这两个桶之间不存在其他有数存在的桶。 换种牵线的说法,绝对存在bucket[j].min - bucket[i].max > bucket[i].size-1(j > i且 i和j之间无其他非空桶)。理解了这点,此题得解。
其实我们只需要遍历次数组,找出最大最小值,然后安装最大最小值,将其他数划分到n个桶里。然后求连续两个非空桶i j的bucket[j].min - bucket[i].max的最大值即可。
想想看,因为我们只需要用到每个桶的最大最小值,所以不需要在每个桶中保存所有的值,只需要最大最小值而已。 有了思路,代码编写其实并不复杂,这里我就不写了(其实是懒得写)。。。
Recommend
-
30
给你一个字符串 s ,「 k 倍重复项删除操作」将会从 s 中选择 k 个相邻且相等的字母,并删除...
-
10
用户从4亿到10亿:Instagram的「相邻用户」增长方法论...
-
6
V2EX › MySQL 请教一个极值差值且最小值需在最大值创建时间前的问题 Te11UA · 1 天前 · 226 次...
-
15
catalog这篇文章没有目录关注本站公众号获取最新福利
-
2
Leetcode-581-最短无序连续子数组 ...
-
6
#yyds干货盘点# 解决名企真题:最大差值 原创 97的风 2022-07-06 11:29:4...
-
6
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看。题目很简单: 给定一个日期,然后计算下距离今天相差的天数。 本以为这么个问题就是用来活跃面试氛围的,但是结果却让人大跌眼镜,真正...
-
14
1)XCode内存和UnityProfiler内存有较大差值 2)Dynamic Bone插件和Job System的写法哪个好 3)编辑器中iOS平台SoftShadow无效 4)Unity 2021中阻止AssetPostprocessor代码改变导致相关资源Reimport 这是第313篇UWA技术知识分享的...
-
5
#yyds干货盘点# 名企真题专题:最大差值 精选 原创 97的风 2022-12-07 18:20:31
-
3
教Claude算日期差值 yaxing 下午 4:52
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK