题目

给定一个未经排序的数组,请找出其排序表中连续两个要素的最大间距。

如果数组中的要素少于 2 个,请返回 0.

 注意事项

可以假定数组中的所有要素都是非负整数,且最大不超过 32 位整数。

样例

给定数组 [1, 9, 2, 5],其排序表为 [1, 2, 5, 9],其最大的间距是在 5 和 9 之间,= 4.

解题

排序后找出最大间隔

堆排序后找到相邻最大值

class Solution {
    /**
     * @param nums: an array of integers
     * @return: the maximum difference
     */
    public int maximumGap(int[] nums) {
        // write your code here
        heapSort(nums);
        int res = 0;
        for(int i=0;i<nums.length-1;i++){
            res = Math.max(res,nums[i+1] - nums[i]);
        }
        return res;
    }
    
    public int left(int i){
        int l = i*2+1;
        return l;
    }
    public int right(int i){
        int r = i*2 +2;
        return r;
    }
    public void heapSort(int[] A){
        int n= A.length-1;
        maxHeap(A,n);
        
        for(int i=n;i>=1;i--){
            swap(A,0,i);
            insertToHeap(A,0,i-1);
        }
    }
    // 构建大顶堆
    public void maxHeap(int[] A,int n){
        
        for(int i=n/2;i>=0;i--){
            insertToHeap(A,i,n);
        }
    }
    // 第i位置插入的堆中,调整为大顶堆
    public void insertToHeap(int[] A,int i,int n){
        int l = -1;
        int r = -1;
        int largest = -1;
        while(true){
            l = left(i);
            r = right(i);
            // 找到最大值id 
            if(l<=n && A[l] > A[i]){
                largest = l;
            }else{
                largest = i;
            }
            if(r<=n &&  A[r] > A[largest]){
                largest = r;
            }
            if(largest!=i){ // 不等时候交换,并更新i循环进行
                swap(A,largest,i);
                i = largest;    
            }else{
                break;
            }
            
        }
    }
    public void swap(int[] A,int i,int j){
        int tmp = A[i];
        A[i] = A[j];
        A[j] = tmp;
    }
}

利用桶排序

参考链接

用n个桶

将n个数据放入到桶内

桶内存放可以放入该桶的数据的最大值和最小值

桶的边缘定义low,high,表示放入该桶内数据的边界,n个桶 的大小d = high - low 是固定的,并且 d = (max - min)/n

这样不会出现数据都在一个桶内的情况

最大的间隔一定在相邻桶间,gap = now.low - pre.high

class Solution {
    /**
     * @param nums: an array of integers
     * @return: the maximum difference
     */

    
  class Bucket{
    int low;
    int high;
    public Bucket(){
        low = -1;
        high = -1; 
    }
}
 
public int maximumGap(int[] num) {
    if(num == null || num.length < 2){
        return 0;
    }
    // 找到最大值最小值
    int max = num[0];
    int min = num[0];
    for(int i=1; i<num.length; i++){
        max = Math.max(max, num[i]);
        min = Math.min(min, num[i]);
    }
 
    // initialize an array of buckets
    Bucket[] buckets = new Bucket[num.length+1]; //project to (0 - n)
    for(int i=0; i<buckets.length; i++){
        buckets[i] = new Bucket(); // 初始化桶
    }
 
    double interval = (double) num.length / (max - min);
    //distribute every number to a bucket array
    for(int i=0; i<num.length; i++){
        int index = (int) ((num[i] - min) * interval);
        // 放入桶内
        if(buckets[index].low == -1){
            buckets[index].low = num[i];
            buckets[index].high = num[i];
        }else{
            buckets[index].low = Math.min(buckets[index].low, num[i]);
            buckets[index].high = Math.max(buckets[index].high, num[i]);
        }
    }
 
    //scan buckets to find maximum gap
    int result = 0;
    int prev = buckets[0].high;
    for(int i=1; i<buckets.length; i++){
        if(buckets[i].low != -1){
            result = Math.max(result, buckets[i].low-prev);
            prev = buckets[i].high;
        }
 
    }
 
    return result;
}
}