题目:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Return 0 if the array contains less than 2 elements.
Example 1:
Input: [3,6,9,1] Output: 3 Explanation: The sorted form of the array is [1,3,6,9], either (3,6) or (6,9) has the maximum difference 3.
Example 2:
Input: [10] Output: 0 Explanation: The array contains less than 2 elements, therefore return 0.
Note:
- You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
- Try to solve it in linear time/space.
代码:
class Solution {
public:
int maximumGap(vector<int>& nums) {
if (nums.empty() || nums.size() < 2) {
return 0;
}
int size = nums.size();
int minN = nums[0], maxN = nums[0];
for (int i = 1; i < size; i++) {
maxN = max(maxN, nums[i]);
minN = min(minN, nums[i]);
}
int gap = (int)ceil((double)(maxN - minN) / (size - 1));
if (gap == 0)return 0;
int bucketNum = (int)(double)(maxN - minN) / gap+1;
vector<int> bucketsMin(bucketNum, INT_MAX);
vector<int> bucketsMax(bucketNum, 0);
int maxGap = 0;
int pre = minN;
for (int i = 0; i < size; i++) {
if (nums[i] == maxN || nums[i] == minN) {
continue;
}
int index = (nums[i] - minN) / gap;
bucketsMax[index] = max(bucketsMax[index], nums[i]);
bucketsMin[index] = min(bucketsMin[index], nums[i]);
}
for (int i = 0; i < bucketNum; i++) {
if (bucketsMin[i] == INT_MAX)continue;
maxGap = max(maxGap, bucketsMin[i] - pre);
pre = bucketsMax[i];
}
maxGap = max(maxGap, maxN - pre);
return maxGap;
}
};
想法:
多了解