無序數組排序後的最大相鄰值

       題目:
       有一個無序整形數組,如何求出該數組排序後的任意兩個相鄰元素的最大差值,要求時間和空間複雜度儘可能低
       解題思路:
       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 getMaxSortedDistance {
    public static int getMaxSortedDistance(int[] array){
        //1.得到數列的最大值和最小值
        int max = array[0];
        int min = array[0];
        for(int i=1;i<array.length;i++){
            if(array[i] > max){
                max = array[i];
            }
            if(array[i]< min){
                min = array[i];
            }
        }
        int d = max -min;
        //如果max和min相等,說明數組所有元素都相等,返回0
        if(d == 0){
            return 0;
        }
        //2.初始化桶
        int bucketNum = array.length;
        Bucket[] buckets = new Bucket[bucketNum];
        for(int i=0;i<bucketNum;i++){
            buckets[i] = new Bucket();
        }
        //3.遍歷原始數組,確定每個數組的最大最小值
        for(int i=0;i<array.length;i++){
            //確定數組元素所歸屬的桶下標
            int index = ((array[i] - min) * (bucketNum - 1) / d);
            if(buckets[index].min == null || buckets[index].min > array[i]){
                buckets[index].min = array[i];
            }
            if(buckets[index].max == null || buckets[index].max < array[i]){
                buckets[index].max = array[i];
            }
        }
        //4.遍歷通,找到最大差值
        int leftMax= buckets[0].max;
        int maxDistance = 0;
        for(int i=1;i<buckets.length;i++){
            if(buckets[i].min == null){
                continue;
            }
            if(buckets[i].min - leftMax > maxDistance){
                maxDistance = buckets[i].min - leftMax;
            }
            leftMax = buckets[i].max;
        }
        return maxDistance;
    }

    private static class Bucket{
        Integer min;
        Integer max;
    }

    public static void main(String[] args){
        int[] array = new int[] {2,6,3,5,19,5};
        System.out.println(getMaxSortedDistance(array));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章