[Leetcode] Maximum Gap

Maximum Gap

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.

桶排序,由于num中的数字肯定在[min,max]区间内,所以根据抽屉原理,假设num中有n个数字,则最大的gap必然要大于dis=(max-min)/(n-1),所以我们可以把num所在的范围分成等间隔的区间,相邻区间内的元素之间的最大差值,即为要寻找的gap。

 1 class Solution {

 2 public:

 3     int maximumGap(vector<int> &num) {

 4         int n = num.size();

 5         if (n < 2) return 0;

 6         if (n == 2) return abs(num[0] - num[1]);

 7         int imin = num[0], imax = num[0];

 8         for (int i = 0; i < n; ++i) {

 9             imin = min(imin, num[i]);

10             imax = max(imax, num[i]);

11         }

12         int dist = (imax-imin) / n + 1;

13         vector<vector<int> > bucket((imax-imin)/dist + 1);

14         int idx;

15         for (int i = 0; i < n; ++i) {

16             idx = (num[i] - imin) / dist;

17             if (bucket[idx].empty()) {

18                 bucket[idx].push_back(num[i]);

19                 bucket[idx].push_back(num[i]);

20             } else {

21                 bucket[idx][0] = min(bucket[idx][0], num[i]);

22                 bucket[idx][1] = max(bucket[idx][1], num[i]);

23             }

24         }

25         int gap = 0, pre = 0, tmp;

26         for (int i = 1; i < bucket.size(); ++i) {

27             if (bucket[i].empty()) continue;

28             tmp = bucket[i][0] - bucket[pre][1];

29             gap = max(gap, tmp);

30             pre = i;

31         }

32         return gap;

33     }

34 };

 

你可能感兴趣的:(LeetCode)