题目:
有一个无序整形数组,如何求出该数组排序后的任意两个相邻元素的最大差值,要求时间和空间复杂度尽可能低
解题思路:
1.使用任意一种复杂度为O(nlogN)的排序算法给原来的数组排序,然后遍历数组,对每相邻的元素求差,可得出。
但是这种时间复杂度太高
2.利用计数排序的思想,先求出最大值Max和最小值min的区间长度k(k=max-min+1),以及偏移量d = min;
创建一个长度为k的新数组Array
遍历原数组,每遍历一个元素,就把新数组array对应下标的值+1,例如原数组的元素值为n,则将Array[n-min]的值加一,遍历结束后,Array的一部分变为1或者更高的数,一部分元素的值热然是0,
遍历新数组Array,统计出Array中连续出现0值的次数加一,即为相邻元素最大差值,
3.桶排序,
利用桶排序的思想,根据原数组的长度n,创建出n个桶,每一个桶代表区间范围,其中第一个桶从原数组的最小值Min开始,区间跨度为(max - min)/(n-1)
遍历原数组,把原数组每一个元素插入到对应的桶中,记录每一个桶的最大值和最小值
遍历所有的桶,统计出每一个桶的最大值,和这个桶右侧非空桶的最小值的差,数值最大的即为原数组排序后的最大相邻差值。
代码如下
public class getMaxSo