题目:
今天这题,虽然说是困难,但是感觉暴力搜索也很快。
题解的两个做法我也看了一下,基数排序的优化方法还可以,但是桶排序的效率感觉甚至比不上暴力搜索。。。。。
先来暴力搜索吧,十分简单
用Sort排序完数组,然后找最大的差值就可以
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
int maximumGap(vector<int>& nums) {
if(nums.size()<2)
{
return 0;
}
sort(nums.begin(),nums.end());
int ans = 0;
for(int i=1;i<nums.size();i++)
{
ans = max(ans,nums[i]-nums[i-1]);
}
return ans;
}
};
int main()
{
vector<int> nums = {3,6,9,1};
Solution s;
int ans = s.maximumGap(nums);
cout<<ans;
}
然后是基数排序,基数排序的思想看这里:
基数排序在这些数字都是整数的时候,确实比sort函数速度上快很多
基数排序
C++代码:
class Solution {
public:
int maximumGap(vector<int>& nums) {
int n = nums.size();
if (n < 2) {
return 0;
}
int exp = 1;
vector<int> buf(n);
int maxVal = *max_element(nums.begin(), nums.end());
while (maxVal >= exp) {
vector<int> cnt(10);
for (int i = 0; i < n; i++) {
int digit = (nums[i] / exp) % 10;
cnt[digit]++;//统计每个桶的数字个数
}
for (int i = 1; i < 10; i++) {
cnt[i] += cnt[i - 1];//这一步是为了后面赋值的时候让线性数组空出空间可以插空
}
for (int i = n - 1; i >= 0; i--) {
int digit = (nums[i] / exp) % 10;
buf[cnt[digit] - 1] = nums[i];//根据数位上的数插空
cnt[digit]--;//插入位置指针前移
}
copy(buf.begin(), buf.end(), nums.begin());//暂存
exp *= 10;
}
int ret = 0;
for (int i = 1; i < n; i++) {
ret = max(ret, nums[i] - nums[i - 1]);
}
return ret;
}
};