對乙個陣列排序之後求相鄰數的最大差值

2021-10-23 03:05:58 字數 1432 閱讀 6594

題目:

給定乙個整形陣列arr,返回排序後的相鄰兩數的最大差值。

時間複雜度為o(n)。

解答:如果用排序法實現,其時間複雜度為o(nlogn),而如果利用桶排序的思想(不是桶排序),可以做到o(n),額外空間複雜度為o(n)。遍歷arr找到最大值max和最小值min。如果arr的長度為n,準備n+1個桶,把max單獨放在第n+1個桶中,[min,max)範圍上的數放在1-n號桶裡,對於1~n號桶中的每乙個桶來說,負責的區間為(max-min)/n。如果乙個數為num,它應該分配進(num-min)*len/(max-min)。具體的解法:

我們假設num應該存放的桶為x,那麼就有這樣乙個公式:

min+x*

(max-min)

/len=num

x就是num應該儲存的桶,x=

(num-min)

*len/

(max-min)

arr一共有n個數,旻、一定會放進1號桶中,max一定會放進最後的桶中,所以,如果把所有的數放進n+1個桶中,必然有桶是空的。產生最大差值的相鄰數來自不同桶。所以只要計算桶之間數的間距可以,也就是只用記錄每個桶的最大值和最小值,最大差值只可能來自某個非空桶的最小值減去前乙個非空桶的最大值。

**如下:

public

static int maxgap

(int[

] nums)

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 =

newboolean

[len +1]

; int[

] maxs =

newint

[len +1]

; int[

] mins =

newint

[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)

求乙個數約數的個數

求約數的個數 計算乙個整數的約數個數 輸入格式 輸入乙個整數 輸出格式 輸出一行,為輸入整數的約數的個數 樣例輸入 10 樣例輸出 4ac import math number int raw input count 0 sqrt float math.sqrt number if number s...

輸入乙個未排序的陣列輸出排序後相鄰元素最大的差值

輸入 多次測試,第一行為陣列元素個數,第二行為陣列元素。輸出 陣列排序後相鄰元素的最大差值。該題關鍵看思路3.思路1,先將陣列排序,然後設定乙個全域性變數為最大值,相減之後作比較。思路2,先將陣列排序,然後設定乙個vector,將相鄰元素差值存入大根堆,最後輸出堆首即可 思路3,利用桶排序的思想,可...

求乙個數中1的個數

碰到遇到乙個有趣的題,求乙個數二進位制的表示中1的個數,該題有兩種解法,一種是使用短除法將該數直接轉化為二進位制數,另一種比較巧妙的演算法是使用與運算,原理如下圖所示 依照此種思入有如下演算法 int numberof1 solution3 int i return count 依照短處法的思路 有...