-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMaximumGap.cpp
More file actions
68 lines (64 loc) · 1.93 KB
/
Copy pathMaximumGap.cpp
File metadata and controls
68 lines (64 loc) · 1.93 KB
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
#include <vector>
#include <stdio.h>
#include <limits.h>
#include <math.h>
using namespace std;
class Solution {
public:
int maximumGap(vector<int> &num) {
if (num.size() < 2) {
return 0;
}
int min_val = INT_MAX;
int max_val = INT_MIN;
for (int i = 0; i < num.size(); i++) {
if (num[i] > max_val) {
max_val = num[i];
}
if (num[i] < min_val) {
min_val = num[i];
}
}
int gap = (int)ceil(double(max_val - min_val) / (num.size() - 1));
int bucket_num = ((max_val - min_val) / gap) + 1;
vector<int> bucket_starts;
vector<int> bucket_ends;
bucket_starts.resize(bucket_num, max_val);
bucket_ends.resize(bucket_num, min_val);
for (int i = 0; i < num.size(); i++) {
if (num[i] == max_val || num[i] == min_val) {
continue;
}
int bucket_idx = (num[i] - min_val) / gap;
if (num[i] < bucket_starts[bucket_idx]) {
bucket_starts[bucket_idx] = num[i];
}
if (num[i] > bucket_ends[bucket_idx]) {
bucket_ends[bucket_idx] = num[i];
}
}
int prev = min_val;
int max_gap = 0;
for (int i = 0; i < bucket_num; i++) {
if (bucket_starts[i] == max_val || bucket_ends[i] == min_val) {
continue;
}
int gap = bucket_starts[i] - prev;
if (gap > max_gap) {
max_gap = gap;
}
prev = bucket_ends[i];
}
if (max_val - prev > max_gap) {
max_gap = max_val - prev;
}
return max_gap;
}
};
int main() {
int test[] = {3, 10, 5, 7, 6, 8, 4, 2};
vector<int> num(test, test + sizeof(test) / sizeof(int) );
Solution s;
int max_gap = s.maximumGap(num);
printf("max_gap=%d\n", max_gap);
}