引言
無限長的無序陣列 ,正負零都有可能。求出排序後最大的相鄰的差值 時間複雜度o(n) 且要求不能用非基於比較的排序
思路1. 找出陣列中的最大元素,分配最大元素+1個桶,對桶等分如一號桶(0-9)、二號桶(10-19).....
2. 因為元素最大是n,所以準備了n+1個桶,所以肯定最小桶和最大桶肯定有數,中間有空桶
3. 如果兩個非空桶中間有空桶,那麼排序後前乙個非空桶最大值,肯定小於後乙個非空桶最小值。肯定是相鄰的。中間是空桶。
例如: 非空桶(0-9) 、空桶(10-19)、非空桶(20-29) 如果第乙個非空桶最大值是9,第二個非空桶最小值是20,那麼必然成 後乙個非空桶最小值大於前乙個非空桶最大值。而且排序後元素9後面必然是元素20.中間是空桶,沒有元素、
4. 後乙個非空桶的最小值減去前乙個非空桶的最大值,必然大於等於桶的取值範圍。
例如:非空桶(0-9) 、空桶(10-19)、非空桶(20-29) 那麼前乙個非空桶最小值範圍是(0-9).第二個非空桶最小值是(20-29), 那麼,最大值範圍-最小值範圍(最小元素9 最大元素20 差值11 最小是0 最大是20 差值20)必然大於等於空桶(10-19)的範圍。
5. 因為第四步,可以知道,不用計算桶內相減的範圍。直接計算後乙個桶最小值減去前乙個桶最大值來得到差值,那麼桶只用記錄負責範圍上最小值和最大值是多少。
6. 計算的差值進行比較,得到最後最大差值。因為兩個非空桶中間有個空桶。後乙個非空桶最小值減去前乙個非空桶最大值的得到的差值不一定是排序後最大差值,所以差值需要進行比較。
**
public class maximumdifference
int len = arr.length;
//設定最小和最大系統值,最小值是系統最大值,最大值是系統最小值
long max = long.min_value;
long min = long.max_value;
// 計算最大值最小值
for (int i = 0; i < len; i++)
// 最大值等於最小值
if(max == min)
// 建立桶
// 判斷桶是否新增過數字
boolean hasnum = new boolean[len + 1];
// 儲存桶最小值
int minnum = new int[len + 1];
// 儲存桶最大值
int maxnum = new int[len + 1];
// 桶號
int bid = 0;
for (int i=0;i//最大差值
int res = 0;
// 從零號桶開始 零號桶必定有值
int lastmax = maxnum[0];
// 迴圈遍歷非空桶 計算差值
for(int i = 1; i<=len; i++)
}return res;
}/**
* 計算在桶的位置
* @param num 當前數
* @param len 桶個數
* @param min 最小值
* @param max 最大值
* @return
*/public static int bucket(long num, long len, long min, long max)
}
利用桶的原理,來進行找到相鄰最大差值,時間複雜度o(n); 無序陣列排序後的最大相鄰差
無序陣列排序後的最大相鄰差 public class maxdis int d max min 1.如果 max和min相等則說明陣列中所有元素都相等則,返回0 if d 0 2.初始化桶 int bucketnum array.length bucket buckets newbucket buc...
求無序陣列排序後相鄰兩個數的最大差值
缺點 當陣列中元素懸殊很大時,如1 2 100000000,則需要構造乙個長度是100000000的新陣列array,則該方法不可取。假設原陣列長度為n 最大差值肯定出現在空桶附近。非空桶內部最大差值d 空間複雜度 o n 時間複雜度 o n 總共掃瞄3次 int maxgap std vector...
無序陣列求最大差值
乙個陣列a 0.n 1 求a j a i 的最大值,其中icite 第一種方法 從左往右求下標0到 k 1 的最小值min 從右往左求 下標k到n 1 的最大值max,對於每個k都有乙個max min的值,最後求這個值的最大值即可。例如陣列 4 5 2 6 3 1 k 1 2 3 4 5 min 4...