題目鏈接:https://leetcode-cn.com/problems/maximum-gap/
要求:線性的時間和空間。
運用桶排序的方法:
步驟:
1 先找出數組中的最大值和最小值;
2 運用最大值和最小值,數組的大小計算桶中的區間大小,
3 依據區間大小計算需要桶的個數;
4 最大差值一定是後一桶的最小值減去前一個桶的最大值。
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.size() < 2) return 0;
if (nums.size() == 2) return abs(nums[1] - nums[0]);
int maxn = 0;//存放最大值
int minn = INT_MAX;//存放最小值
for (int i = 0; i < nums.size(); i++)
maxn = max(maxn, nums[i]);
for (int i = 0; i < nums.size(); i++)
minn = min(minn, nums[i]);
if(maxn==minn) return 0;//若相等的話說明數組中存在n個相同數字
int size = (maxn - minn) / nums.size();//區間大小
if(size<1) size=1;//若size小於1說明數組存在很多重複元素
int num = (maxn - minn) / size + 1;//桶的個數
vector<int> nummax(num, 0);//存放桶的最大值
vector<int> nummin(num, maxn);//存放桶的最小值
nummin[0] = minn;
nummax[0] = minn;
nummax[num - 1] = maxn;
nummin[num - 1] = maxn;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] == maxn || nums[i] == minn)
continue;
int qnum = (nums[i] - minn) / size;//找到放置區間數
nummax[qnum] = max(nummax[qnum], nums[i]);
nummin[qnum] = min(nummin[qnum], nums[i]);
}
for (int i = 0; i < nummin.size(); i++)//刪除空桶
{
if (nummax[i] == 0 && nummin[i] == maxn)
{
nummax.erase(nummax.begin() + i);
nummin.erase(nummin.begin() + i);
i--;
}
}
int res = 0;//結果
for (int i = 1; i < nummax.size(); i++)
{
res = max(res, nummin[i] - nummax[i-1]);
}
return res;
}
};