相邻两数最大差值 -- 算法小结

有一个整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。

给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。

测试样例:
[1,2,5,4,6],5
返回:2

编程思路:本题明显就是先排序,后比较相邻数的差值,因此有很多的实现方法,首先就是排序,我们可以选择复杂度较低的算法,这里使用类似桶排序的思想,我们不是以元素的值来计算桶的数目,而是元素个数来划分桶,即使桶的个数比元素个数多1,最大和最小的元素之间等差值的放置桶,将元素依次放入各桶之间,由于桶比元素多1,必定有一个以上的桶是空的,而最大的差值,必定处于空桶左右,只需记录每个桶里面的最大值和最小值即可,最大差值即为后一个桶的最小值-前一个桶的最大值(以空桶为基准)。。。。

import java.util.*;
public class Gap {
    public int maxGap(int[] A, int n) {
        // write code here
        if(A==null||n<2)
            return 0;
        int max = Integer.MIN_VALUE;
        int min = Integer.MAX_VALUE;
        for(int i=0;i//找出最大值
            min = Math.min(min, A[i]);//找出最小值
        }
        if(max==min){
            return 0;
        }
        boolean[] bo = new boolean[n+1];  //桶标识,表示当前桶是否为空
        int[] maxs = new int[n+1];  //桶中最大值
        int[] mins = new int[n+1];  //桶中最小值
        int tem =0;
        for(int i=0;i//找到桶的位置
            maxs[tem] = bo[tem]?Math.max(maxs[tem], A[i]):A[i];    //更新当前桶最大值
            mins[tem] = bo[tem]?Math.min(mins[tem], A[i]):A[i];    //更新当前桶的最小值
            bo[tem] = true;
        }
        int res = 0;
        int lastMax = 0;    
        int i=0;
        while(i<=n){   //得到第一个空桶
            if(bo[i++]){
                lastMax = maxs[i-1];
                break;
            }
        }
        for(;i<=n;i++){
            if(bo[i]){
                res = Math.max(res, mins[i]-lastMax);
                lastMax = maxs[i];
            }
        }
        return res;
    }

    private int getNum(long i, long n, long max, long min) {
        // TODO Auto-generated method stub
        return (int)((i-min)*n/(max-min));
    }
}

相邻两数最大差值 -- 算法小结_第1张图片

你可能感兴趣的:(算法小结)