FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
leetcode/algorithms/maximumGap/maximumGap.cpp at master · nuclearhacking/leetcode · GitHub
nuclearhacking
/
leetcode
Public
forked from
haoel/leetcode
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Wiki
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Wiki
Security and quality
Insights
Expand file tree
Breadcrumbs
leetcode
/
algorithms
/
maximumGap
/
maximumGap.cpp
Copy path
More file actions
More file actions
Latest commit
History
History
History
75 lines (64 loc) · 2.46 KB
Breadcrumbs
leetcode
/
algorithms
/
maximumGap
/
maximumGap.cpp
Copy path
File metadata and controls
75 lines (64 loc) · 2.46 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
;
}
Back
|
FazBrowse Home
|
New Git URL