給定乙個陣列a及其大小n,求其排序後的相鄰兩數的最大差值。(注:要求時間複雜度為o(n))
思路:題目要求對排序後的陣列進行操作,顯然需要先對陣列進行排序。如果沒有要求時間複雜度,那麼可以有很多種排序演算法,如快速排序、堆排序、歸併排序等等。但是這裡要求時間複雜度為o(n),就不能用上述常規的排序演算法了。
那麼桶排序可以嗎?由於我們不知道最大數的位數,因此,如果最大數的位數很大的話,我們就需要成千上萬個桶,顯然對空間要求太大。我們可以利用桶排序的思想,利用它的變種:
1) 首先求出陣列的最大值max和最小值min;
2) 然後將該區間均等的劃分為n+1份,即n+1個桶,那麼由於只有n個數,因此,必定至少有乙個桶為空桶;
3) 遍歷陣列,將所有數入桶,並記錄每乙個桶的最大值和最小值;
4) 不用考慮桶內數的差值,因為它都不會大過空桶兩邊的桶的數的差值;
5) 依次遍歷每乙個桶,找到乙個空桶,記錄其前乙個非空桶的最大值和其後乙個非空桶的最小值,它們的差值就是最大的(考慮有多個空桶的情況)。
code:
int maxgap(int a, int n)
int* minarr = new int[n+1]();//記錄每個桶中的最小數
int* maxarr = new int[n+1]();//記錄每個桶中的最大數
bool hasnum[n+1] = ;//記錄桶中是否有數
for(int i = 0; i < n; ++i)
int maxgap = 0;//記錄最大差值
int lastmax = 0;//記錄當前空桶的上乙個桶的最大值
int i = 0;
while(i < n + 1)
delete minarr;
delete maxarr;
return maxgap;
}//求出每乙個數所在的桶的編號
int bocketnum(int a, int i, int min, int max, int len)
int min(int a, int b)
int max(int a, int b)
陣列相鄰兩數最大差值
思路 因為要求時間複雜度為o n 且不能用非比較排序,常用的比較排序很難做到o n 這裡是借助n 1個桶,將n個數平均分配到n個桶裡,所以我們所求的最大差值肯定不在乙個桶內 只有乙個數另說 然後依次求出當前桶最小值與前乙個非空桶最大值的差值,求出最大的差值就是我們要的結果。static class ...
相鄰兩數最大差值
有乙個整形陣列a,請設計乙個複雜度為o n 的演算法,算出排序後相鄰兩數的最大差值。給定乙個int陣列a和a的大小n,請返回最大的差值。保證陣列元素多於1個。測試樣例 1,2,5,4,6 5返回 2 基於桶排序的思想完成,不考慮兩個相同的桶內的差值,只考慮該桶的最小值減去上乙個桶的最大值,最大的就是...
相鄰兩數最大差值
有乙個整形陣列a,請設計乙個複雜度為o n 的演算法,算出排序後相鄰兩數的最大差值。給定乙個int陣列a和a的大小n,請返回最大的差值。保證陣列元素多於1個。測試樣例 1,2,5,4,6 5返回 2 解析 使用bucket排序思想,把大小為n的陣列分成 max min n個區間,顯然這個區間是1 n...