leetcode——最大間距

題目鏈接: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;
	}
};

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章