题目:有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。测试样例:[1,2,5,4,6],5返回:2
思路:直接的思路,先排序,再遍历数组求出相邻2个数的差,保留最大值即可,此时时间复杂度为O(nlogn)。本题采用的是桶排序的思想,对于n个数,设置n+1个桶,具体的,先遍历数组找出min和max,差值区间设置为d=(max-min)/n,于是区间是[min~min+d);[min+d~min+2d)……[min+(n-1)d~min+nd)这n区间,再单独为最大值max设置一个桶,于是得到n+1个桶,已知数组元素总共有n个,但是桶有n+1个,并且元素min必定在第一个桶中,max必定在n+1号桶中;显然要把n个元素放入到n+1个桶中必定会产生空桶,已知数组中的元素时整数,而虽然每个桶区间不一定是整数,例如[23/7,31/7),但是没有关系,对于任意一个元素,它总会落入到某一个桶中,并且可以知道,不同桶之间元素的差值必定大于d,同一个桶中的元素的差值必定小于d,于是可知要求元素之间的最大差值只需要在不同的桶之间寻找,不用在同一个桶中寻找,并且题目要求是排序后相邻2个元素的最大差值,于是应该寻找2个相邻非空桶中前一个桶的最大值与后一个桶的最小值之间的差值,遍历所有桶,比较得到所有差值中的最大值就是结果所