forked from haoel/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 39
/
maximumGap.cpp
75 lines (64 loc) · 2.46 KB
/
maximumGap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Source : https://oj.leetcode.com/problems/maximum-gap/
// Author : Hao Chen
// Date : 2014-12-17
/**********************************************************************************
*
* 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.
*
**********************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
int maximumGap(vector<int> &num) {
if (num.size() < 2) return 0;
//find the max & min element
int min=num[0], max=num[0];
for(int i=1; i<num.size(); i++){
min = min > num[i] ? num[i] : min;
max = max < num[i] ? num[i] : max;
}
//Divide the interval [min, max] into n "buckets" of equal size = (max -min)/n
int bucket_size = (max - min)/num.size() + 1;
//For each of the remaining n-2 numbers, determin in which bucket it falls .
//The number num[i] belongs to the kth bucket B[k] if and only if (num[i]-min)/m = k-1
vector< vector<int> > buckets ( (max-min)/bucket_size + 1);
//For each bucket B[k], compute its max & min among the numbers which falls in B[k].
//if the bucket is empty, remain it nothing.
//if the bucket has one number, make this number as both max & min
for(int i=0; i<num.size(); i++){
int idx = (num[i] - min) / bucket_size ;
if (buckets[idx].empty()){
buckets[idx].push_back(num[i]);
buckets[idx].push_back(num[i]);
}else{
buckets[idx][0] = buckets[idx][0] > num[i] ? num[i] : buckets[idx][0];
buckets[idx][1] = buckets[idx][1] < num[i] ? num[i] : buckets[idx][1];
}
}
//calculate the max gap
int maxGap = 0;
int prev = 0;
for (int i = 1; i < buckets.size(); i++) {
if (buckets[i].empty()) continue;
int gap = buckets[i][0] - buckets[prev][1];
maxGap = maxGap > gap ? maxGap : gap;
prev = i;
}
return maxGap;
}
int main()
{
//int a[] = {3, 6, 19, 1};
int a[] = {1,1,1,1,1,5,5,5,5,5};
vector<int> num(a, a+sizeof(a)/sizeof(a[0]));
cout << maximumGap(num) << endl;
return 0;
}