題目描述:
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 陣列元素個數小於 2,因此返回 0。
說明:方法1:
主要思路:
(1)使用桶排序;
(2)使用桶排序,需要先找出給出的陣列中的最大值max_num和最小值min_num,然後根據陣列內元素的範圍,設定合適大小的桶,這裡由於是要求相鄰的元素之間最大的差值,則這個最大的差值理論上最小的情況是各個元素之間成等差數列分布,則此時的等差大小,即可為此時的桶的大小,既step=(max_num-min_num)/(nums.size()-1)>1?(max_num-min_num)/(nums.size()-1):1;
(3)然後確定桶的數量,則在上述情形下,理論上的桶中每個包括乙個元素的情形時,桶的數量為(max_num-min_num)/step+1,而桶中需要儲存的資料是應該存入到桶中的所有的資料的最小值和最大值,故總的桶為vector> buckets((max_num-min_num)/step+1,pair(int_max,int_min));然後遍歷原陣列,將陣列中的元素對應的放入到相應的桶中,這裡就是對應的更新相應的桶中最大值和最小值即可,遍歷完陣列,既完成了桶排序;
(4)進行完桶排序之後,需要找出最大的間隔,則間隔可能出現的位置是在相鄰桶中,後乙個桶的最小值和前乙個桶的最大值之差,遍歷完桶,既獲得最大的間距;
class
solution
//儲存陣列中的最大值和最小值
int min_num=int_max;
int max_num=int_min;
for(
int&num:nums)
//求出桶的大小
int step=
(max_num-min_num)
/(nums.
size()
-1)>1?
(max_num-min_num)
/(nums.
size()
-1):
1;vectorint,
int>>
buckets
((max_num-min_num)
/step+
1,pair<
int,
int>
(int_max,int_min));
//確定桶的數量,構造桶儲存結構
for(
int& num:nums)
//使用第一桶中的值初始化
int res=0;
//儲存結果
int pre_max=buckets[0]
.second;
//儲存當前桶的前乙個桶中的最大值
for(
int i=
1;isize()
;++i)
}return res;}}
;
164 最大間距
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。思路 注釋 public static int maximu...
164 最大間距
開始想的是計數排序,但超時,如 2,999999999 這樣的樣例,記錄陣列太長,有用的佔比太少。後看官方思路,用n 1 n為原陣列元素個數 個桶去篩元素,每個桶能放的元素大小範圍固定,即下面 中的step,處理完後再掃瞄一遍當前桶最大和後繼桶最小值的差,取最大差值為結果。至於為什麼要n 1個桶,我...
164 最大間距
題目.high 對於整數型的排序問題,首先應該聯想到桶排序,這是唯一on的排序演算法。另外假設我們把n個數放在n 1個桶裡面,必定有空桶產生,那麼最大間距肯定在間隔了空桶的兩個桶之間產生 package main import fmt type bucket struct func maximumg...