数组排序后相邻数的最大差值,要求时间复杂度O(N),空间复杂度O(N),完整代码贴上有注释。
整体思路是利用桶排序的思路,定义一组N+1个桶,每个桶的范围是由最小值和最大值表示,两个相邻桶的最大值和最小值的差值就是相邻数的最大差。
代码很简单,但是比较难理解的是如何找到这个数所在的桶。
奈何网上找的所有文章并没有对该公式的解释,所以记下对公式的理解:
(num - min) * len / (max - min);
(算法的整体思路网上都有,主要内容是如何找到数所在的桶分析)
* 1.这个公式保证了最小数放在数组索引0也就是头部,最大数恰好放在数组的末尾,那么其他所有的数都在这个最小数和最大数之间也就是数组中,
* 2.所以保证了所有的数都不会越界,位置就在数组上。
* 3.因为整个公式中唯一变化的就是num,只有num会影响计算出桶所在的位置,当num等于A,B两个数,A>B的时候,A的桶位置一定大于或者等于B的桶位置
* 所以不用关心一个桶的范围到底有多大,只要保证有序的两个数计算出桶的位置有序就行,这个很巧妙。
* 数是有序的,而一个桶里只包含了最小和最大,当一个数往桶里放的时候必须满足最大或最小,否则会被过滤
* 类似于一个桶等于一个有序子串,有序子串的首位和末尾就是最小和最大
package com.algorithm.question;
public class GongCha2Test {
public static void main(String[] ar