給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 陣列元素個數小於 2,因此返回 0。
說明:解析:
本題的難度在於時間複雜度與空間複雜度的要求,線性複雜度的限制要求我們只能用一次或數次遍歷陣列的方法解決問題。
這裡我們使用桶排序的思想。
構建乙個桶的資料結構,其中僅儲存兩個變數,最大值與最小值,用來記錄所屬該桶的所有資料中最大與最小的兩個值。
我們只需要根據陣列的資料構建一定數量的桶,將陣列的資料插入桶中,最後對桶進行相互比較即可獲得陣列元素間的最大間距。
空間複雜度:我們根據陣列中的元素來構建一定數量的桶,桶的數量不超過元素的數量,且每個桶僅維護兩個變數,故空間複雜度為o(n)
時間複雜度:整個計算過程,遍歷了兩次陣列和一次桶,故時間複雜度為o(n*3) = o(n)
class
solution
;int
maximumgap
(vector<
int>
& nums)
if(max < num)
}//構造桶
int bucketsize =
(max - min)
/(nums.
size()
-1);
//桶的容量
if(bucketsize ==
0) bucketsize =1;
//當數字非常密集時,可能出現容量為0的可能,將最小容量設定為1
int bucketnum =
(max - min)
/ bucketsize +1;
//桶的數量
vector
buckets
(bucketnum)
;//桶
//第二次遍歷,將所有數字塞進桶中
for(
int num : nums)
if(buckets[pos]
.min > num)
}//遍歷桶,獲取兩個桶之間最大的差值
int res =0;
int pre = min;
for(
int i=
0;isize()
;++i)
pre = buckets[i]
.max;
}return res;}}
;
LeetCode 164 最大間距
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。示例 2 輸入 10 輸出 0解釋 陣列元素個數小於 2,因此...
leetcode 164 最大間距
給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。第一時間想到的也是最簡單的,先將所給陣列排序,再遍歷一遍陣列找出最大間距 複雜度分析 首先我們來了解一下桶排序的思想。桶排序是體現了分治的思想。原理是建立若干個桶,通過某種對映將待排序的元素放置到桶...
leetcode 164 最大間距
目錄 一 題目內容 二 解題思路 三 給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。如果陣列元素個數小於 2,則返回 0。示例 1 輸入 3,6,9,1 輸出 3 解釋 排序後的陣列是 1,3,6,9 其中相鄰元素 3,6 和 6,9 之間都存在最大差值 3。示例 2 輸入 10 ...