借助桶排序思想完成的一道題

2021-09-24 11:26:00 字數 1616 閱讀 8749

問題:

陣列排序之後的相鄰數的最大差值;

嗯,你可以排序,然後找相鄰的最大差值。

但是你覺得這麼簡單我寫他幹啥。

最優解:時間複雜度o(n),空間o(1)

那我們開始說這種方法:

1)遍歷所有數,找到最小值和最大值:min和max

2)設陣列長度為n,我們準備n+1個桶

3)把max放進最後乙個桶裡,min放到第乙個桶裡

4)每乙個桶都負責放乙個範圍內的數字,負責的範圍大小是(max-min)/n。

(比如長度為10,最小值為10,最大值為110,那麼準備11個桶,第乙個桶放[10,20)的數字,第二個桶放[20,30)的數字......)

重點來啦:因為有n+1個桶,有n個數字,我們就發現了乙個問題:必定會有空的桶

為什麼我們一定要有空的桶呢?

這樣我們就可以做到:桶內的相鄰數字的差,一定沒有不同桶之間的數字的差大

有了這個結論我們可以做什麼呢?

其實找相鄰桶和桶之間的差就好啦,桶內的那些情況根本不用關心

想到這裡,我們發現桶裡根本不用關心到底有幾個數,他們的差是多少,只要記錄每個桶的最大值最小值即可。

最後一點小問題啦:對於乙個數num,他應該放在哪個桶,最好推個公式吧?

它應該被放在(num-min)*len/(max-min)這個桶裡。也不難推。

最後就是寫**啦。

public class maxgap 

int len = nums.length;

int min = integer.max_value;

int max = integer.min_value;

for (int i = 0; i < len; i++)

if (min == max)

boolean hasnum = new boolean[len + 1];//記錄是否空

int maxs = new int[len + 1];//桶內最大值

int mins = new int[len + 1];//桶內最小值

int bid = 0;

//放入桶中

for (int i = 0; i < len; i++)

int res = 0;

int lastmax = maxs[0];

int i = 1;

//相鄰桶求最大差值

for (; i <= len; i++)

} return res;

} public static int bucket(long num, long len, long min, long max)

public static void main(string args) ;

system.out.println(maxgap(arr));

}}

一道關於程式設計思想的經典題

問題 乙個前後臺 linux win32 共用的函式,函式實現的功能為拼裝乙個sql,如果我們想把它改為安全函式,如何改呢?void makesqlstring int a,int b,char sqlstring int len sprintf sqlstring,update tablea se...

一道部分排序題

題目 時間限制 4000ms 給你n個整數,請按從大到小的順序輸出其中前m大的數。input 每組測試資料有兩行,第一行有兩個數 n,m 0 n,m 4000000 第二行包含n個各不相同,且都處於區間 2000000,2000000 的整數。output 對每組測試資料按從大到小的順序輸出前m大的...

一道關於排序的演算法題

題目 給定乙個無序陣列a,一直這個陣列a中的任意乙個元素所在的位置離其最終排序後的位置相差的距離不會超過k。即排序前a i 在位置i,那麼在排序後該元素的位置會在 i k,i k 這個範圍內。現在要求給出乙個演算法使得演算法盡量高校。解析 這裡就不多說了,直接給自己的解法吧。利用乙個大小為k 1的最...