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.
题目要求O(N)复杂度
不过用O(NlogN)的map做桶也能过
1.
class Solution {
public:
int maximumGap(vector<int> &num) {
int n = num.size();
if(n < 2){
return 0;
}
for(auto a : num){
Map[a] = true;
}
auto it = Map.begin();
int last = it->first;
++it;
int ans = 0;
for(; it != Map.end(); ++it){
ans = max(ans, it->first - last);
last = it->first;
}
return ans;
}
private:
map<int, bool> Map;
};
2. O(N)的算法,假设N个数的范围是A到B,那么答案一定不小于ceiling((B - A)/(N - 1))。所以桶的大小按照此值定义,最后的答案一定在间隔的桶中。
class Solution {
public:
int maximumGap(vector<int> &num) {
int n = num.size();
if(n < 2){
return 0;
}
int B = *max_element(num.begin(), num.end());
int A = *min_element(num.begin(), num.end());
int len = (B - A - 1) / (n - 1) + 1;
int b_num = (B - A) / len + 1;
vector<Bucket> buckets(b_num);
for(auto i : num){
int index = (i - A) / len;
buckets[index].maxx = max(buckets[index].maxx, i);
buckets[index].minn = min(buckets[index].minn, i);
}
int ans = 0;
int last = A;
for(int i = 0; i < b_num; ++i){
if(buckets[i].maxx == INT_MIN){
continue;
}
ans = max(ans, buckets[i].minn - last);
last = buckets[i].maxx;
}
return ans;
}
private:
struct Bucket{
int minn = INT_MAX;
int maxx = INT_MIN;
};
};