![56d1dee7c5b6c9ddb91731b8d4008876.png](https://img-blog.csdnimg.cn/img_convert/56d1dee7c5b6c9ddb91731b8d4008876.png)
@TOC
通排序是初始化一定数量的桶arr[n]={0} 对于数i 填入arr[i]即可(arr[i]++) 那么最后遍历arr即可,适用于范围较小的排序,复杂度为O(N)
题目描述 给定一个整形数组arr,返回排序后相邻两数的最大差值 arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大差值,故返回6。 arr = [5, 5, 5, 5]。返回0。 [要求] 时间复杂度为O(n),空间复杂度为O(n)
思路
本题求排序后相邻两个数的最大差值,对于n个数字,其大小范围为:【min,max】 那么可以有推论:
最大差值>=width/n-1 取到最小值时,恰好所有数字之间间隔相等
本题的通排序做法是:
初始化一定数量的桶,每个桶的表示范围为width/n-1 总共n+1个桶,那么每个数字可以映射到不同的桶
![cf470bb48c98413b4e1e84bc43b20204.png](https://img-blog.csdnimg.cn/img_convert/cf470bb48c98413b4e1e84bc43b20204.png)
总共数字的范围是:min=>max 而总共两两之间的区间个数为 n-1 那么直接设定桶的数量为n
每个桶的映射范围大小为:width/n-1 那么 最大差值的两个数一定分布在不同的桶。*
具体到每个桶,其只需要记录所在桶的数字中最大值,最小值即可。因为最大差值由于分布在不同的桶:
当前桶的最小值-减去上一个桶的最大值(过滤掉没有数值的桶) 遍历一遍桶即可找到最大差值
@TOC
#include