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.

Credits:
Special thanks to @porker2008 for adding this problem and creating all test cases.

 

题目大意:

给定一个未排序的数组,找出其排序后的序列中两个相邻元素之间的最大差值。

最好在线性时间、线性空间复杂度内完成。

如果数组少于2个元素,返回0

可以假设数组中的所有元素均为非负整数,并且在32位带符号整数的范围以内。

解题思路:

基数排序(radix sort)/桶排序(bucket sort)

官方版(桶排序):

假设有N个元素A到B。

那么最大差值不会大于ceiling[(B - A) / (N - 1)]

令bucket(桶)的大小len = ceiling[(B - A) / (N - 1)],则最多会有(B - A) / len + 1个桶

对于数组中的任意整数K,很容易通过算式loc = (K - A) / len找出其桶的位置,然后维护每一个桶的最大值和最小值

由于同一个桶内的元素之间的差值至多为len - 1,因此最终答案不会从同一个桶中选择。

对于每一个非空的桶p,找出下一个非空的桶q,则q.min - p.max可能就是备选答案。返回所有这些可能值中的最大值。


 

    1. class Solution {  
    2.     public:  
    3.         int maximumGap(vector<int> &num) {   
    4.             if (num.empty() || num.size() < 2)  
    5.                 return 0;  
    6.             int Max = *max_element(num.begin(), num.end());  
    7.             int Min = *min_element(num.begin(), num.end());  
    8.   
    9.             int gap = (int)ceil((double)(Max-Min)/(num.size() - 1));  
    10.             int bucketNum = (int) ceil((double)(Max-Min)/gap);  
    11.             vector<int> bucketsMin(bucketNum, INT_MAX);     
    12.             vector<int> bucketsMax(bucketNum, INT_MIN);  
    13.   
    14.             for (int i = 0; i < num.size(); i++) {  
    15.                 if (num[i] == Max || num[i] == Min)  
    16.                     continue;  
    17.                 int idx = (num[i] - Min) / gap;  
    18.                 bucketsMin[idx] = min(bucketsMin[idx], num[i]);  
    19.                 bucketsMax[idx] = max(bucketsMax[idx], num[i]);  
    20.             }  
    21.   
    22.             int ans = INT_MIN;  
    23.             int previous = Min;  
    24.             for (int i = 0; i < bucketNum; i++) {  
    25.                 if (bucketsMin[i] == INT_MAX || bucketsMax[i] == INT_MIN)   
    26.                     continue;  
    27.                 ans = max(ans, bucketsMin[i] - previous);  
    28.                 previous = bucketsMax[i];  
    29.             }  
    30.   
    31.             ans = max(ans, Max - previous);  
    32.             return ans;  
    33.         }  
    34. }; 
class Solution {
public:
    int maximumGap(vector<int> &num) {
        if (num.size() < 2) return 0;
    	int maxa = *max_element(num.begin(),num.end());
        int mina = *min_element(num.begin(),num.end());
    
    //   if (mina == maxa) return 0;
    
        double mind = (maxa - mina) * 1.0 / (num.size() - 1);
    
        int count = (int)((maxa - mina) / mind); //number of buckets
        vector < pair<int, int> > bug(count + 1, make_pair(INT_MAX, INT_MIN)); // store min and max at bucket
    //    vector <bool> exist(count + 1, false); // this is for checking if there are any elements at bucket
        for (int i = 0; i < num.size(); i++) {
            int loc = (num[i] - mina) / mind;
     //       exist[loc] = true;
            bug[loc].first = min(bug[loc].first, num[i]);
            bug[loc].second = max(bug[loc].second, num[i]);
        }
    
        int maxdif = 0;
        int last = mina;
    
        for (int i = 0; i < count + 1; i++) {
            if (bug[i].first != INT_MAX || bug[i].second != INT_MIN) {
                maxdif = max(maxdif, bug[i].first - last);
                last = bug[i].second;
            }
        }
        return maxdif;
    }

};

 

posted on 2015-01-09 20:16  风云逸  阅读(185)  评论(0)    收藏  举报