164. 最大间距
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:
你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
说明部分清晰的表达了这道题目需要用基数排序。C++库模板的 sort 函数完全满足这一条件,但我还是自己写了一份还没写对,后来还是查资料,复习了一边基数排序,勉强写出来:
- 之前的思路,把数字按照个位数分到每个桶,按照每个桶在进行桶排序,之后合并。相当于桶排序+归并排序。很不好意思的是没写好。实际上这个效果也并一定不好,因为还是要用那么多桶。
- 比较好理解的做法:
先对个位 基数排序(全部元素)
再对十位 基数排序(全部元素)
class Solution {
public:
typedef vector<int>::iterator iterator;
void copy(iterator org_s, iterator org_e, iterator trg) {
for (; org_s != org_e; trg++,org_s++)
*trg = *org_s;
}
void bucketSort(iterator start, iterator end, int bit=1) {
bool flag = true;
for (vector<int>::iterator it = start; it != end; it++)
if (*it >= bit)
flag = false;
if(flag == true)
return;
vector<int> buckets[10];
for (iterator it = start; it != end; it++)
buckets[(*it/bit)%10].push_back(*it);
iterator it = start;
for(int i=0; i<10; i++)
if (!buckets[i].empty()) {
copy(buckets[i].begin(), buckets[i].end(), it);
it = it + buckets[i].size();
}
bucketSort(start, end, bit * 10);
}
int maximumGap(vector<int>& nums) {
if(nums.size() <2)
return 0;
// C++ 库函数排序
// sort(nums.begin(), nums.end());
bucketSort(nums.begin(), nums.end());
iterator it=nums.begin();
int max = 0;
for(it = it+1; it!=nums.end(); it++) {
int tmp = *it - *(it-1);
max = tmp>max?tmp:max;
}
return max;
}
};