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.
class Solution {
public:
int maximumGap(vector<int> &num)
{
const int SIZE = num.size();
if (SIZE < 2)
return 0;
for (int i = 0; i < 32; i++)
{
vector<int> sorted(SIZE);
int k[] = {0, 0};
for (int j = 0; j < SIZE; j++)
{
int filter = 1 << i;
int tmp = (filter & num[j]) >> i;
if (0 == tmp)
k[0]++;
else
k[1]++;
}
k[1] += k[0];
for (int j = SIZE - 1; j >= 0; j--)
{
int filter = 1 << i;
int tmp = (filter & num[j]) >> i;
sorted[--k[tmp]] = num[j];
}
for (int j = 0; j < SIZE; j++)
num[j] = sorted[j];
}
int res = num[1] - num[0];
for (int i = 2; i < SIZE; i++)
res = max(res, num[i] - num[i-1]);
return res;
}
};