题目:leetcode
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Try to solve it in linear time/space.
Return 0 if the array contains less than 2 elements.
You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
提示:
假设题目中的排序数组是升序。
运用桶排序,把数组平均分成len组(len是数组元素个数),每组前闭后开,其中最后一组只有一个元素——最大值。
则最大的gap的来源只有一种可能:两个相邻非空的桶之间,“大桶最小值”减去“小桶最大值”之差。
若输入的数组中所有元素都相等时,程序返回0。
//返回值第一个是数组最小值,第二个数是数组最大值
pair<int, int> minmax(const vector<int> &s)
{
if (s.size()==1)
return make_pair(s[0], s[0]);
int rmin = INT_MAX, rmax = -1;
for (size_t i = 0; i < s.size(); i++)
{
rmin = min(rmin, s[i]);
rmax = max(rmax, s[i]);
}
pair<int, int> res = { rmin, rmax };
return res;
}
//把数组s的元素平均分成s.size()组,每组前闭后开,即类似 [a,b)
vector<vector<int>> bucketsort(const vector<int> &s, const int size)
{
pair<int, int> r = minmax(s);
double interval = r.second - r.first;
interval /= size - 1;
vector<vector<int>> bucket(size);
for (size_t i = 0; i < s.size(); i++)
{
double temp=(s[i] - r.first) / interval;
int index = temp;
bucket[index].push_back(s[i]);
}
return bucket;
}
int FindMaxGap(const vector<int> &s)
{
if (s.size() < 2)
return 0;
vector<vector<int>> bucket = bucketsort(s,s.size());
//bucket[0]肯定非空,因为里面有最小值
pair<int, int> r = minmax(bucket[0]);
//把gap初始化为0,当输入的数组中所有元素都相等时,返回0
int gap = 0, premax = r.second;
for (size_t i =1; i < bucket.size(); i++)
{
if (bucket[i].empty())
continue;
pair<int, int> t = minmax(bucket[i]);
gap = max(gap,t.first - premax);
premax = t.second;
}
return gap;
}
//测试代码
srand((unsigned)time(NULL));
vector<int> n;
for (int i = 0; i < 10; i++)
{
int t = rand() % 100 + 1;
n.push_back(t);
cout << t << "\t";
}
cout << endl;
cout << FindMaxGap(n) << endl;
sort(n.begin(), n.end());
for (int i = 0; i < 10; i++)
{
cout << n[i] << "\t";
}
LeetCode求解最大间隔
本文介绍了一种解决LeetCode上特定问题的方法:寻找数组排序后连续元素的最大差值,并提出了使用桶排序来高效地找到这个最大差值的算法实现。
3436

被折叠的 条评论
为什么被折叠?



