給定乙個無序的陣列,找出陣列在排序之後,相鄰元素之間最大的差值。
如果陣列元素個數小於 2,則返回 0。
示例 1:
輸入: [3,6,9,1]
輸出: 3
解釋: 排序後的陣列是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例 2:
輸入: [10]
輸出: 0
解釋: 陣列元素個數小於 2,因此返回 0。
說明:
你可以假設陣列中所有元素都是非負整數,且數值在 32 位有符號整數範圍內。
思路分析:需要知道最大間距,那麼一般來說是要先進行排序的,時間複雜度為o(n)的排序方法中,好像我就知道計數排序、桶排序。
方法一:使用map容器輔助,進行計數排序。(但是map自動排序的複雜度貌似是o(nlogn))
class solution
mapmymap;//輔助容器,用於標記各個元素的出現的次數
//掃瞄nums
for (int index = 0; index < numssize; ++index)
int maxgap = 0;//存放結果
map::iterator before = mymap.begin();
//再次掃瞄容器,判斷排序好的左右兩端的間距差
方法二:使用桶排序,但不建立正真的桶,而是虛設的桶,只保留桶中的最大值、最小值。桶的數量為nums.size() + 1,所以每個桶至多只有乙個元素,(且最小值放在第乙個桶,最大值放在最後乙個桶),只設立每個桶的最大值、最小值變數。再將所有元素都放入它應該在的桶序號,最後掃瞄所有的桶,求出間距。
class solution
int maximumgap(vector& nums)
int maxvalue = *max_element(nums.begin(), nums.end());//獲取桶中的最大值
int minvalue = *min_element(nums.begin(), nums.end());//獲取桶中的最小值
if (maxvalue == minvalue)
int bucketcnt = numssize + 1;//桶的個數
vectormaxbucket(bucketcnt, int_min);//新建長度bucketsize的vector容器,maxbucket[i]用於儲存第i個桶的最大值
vectorminbucket(bucketcnt, int_max);//新建長度bucketsize的vector容器,minbucket[i]用於儲存第i個桶的最小值
maxbucket[0] = minbucket[0] = minvalue;//第乙個桶只儲存最小值
maxbucket[bucketcnt - 1] = minbucket[bucketcnt - 1] = maxvalue;//最後乙個桶只儲存最大值
for (auto num : nums)
int maxgap = int_min, preindex = 0;
//掃瞄所有的桶,計算桶之間的間距
for (int index = 1; index < bucketcnt; ++index)
if (preindex == bucketcnt)
index = preindex + 1;
//跳過空桶
while (index < bucketcnt && maxbucket[index] == int_min)
if (index == bucketcnt)
//更新間距
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 ...