题目描述
给定一个无序的数组 nums
,返回 数组在排序之后,相邻元素之间最大的差值 。如果数组元素个数小于 2,则返回 0
。
您必须编写一个在「线性时间」内运行并使用「线性额外空间」的算法。
示例 1:
- 输入: nums = [3,6,9,1]
- 输出: 3
- 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
- 输入: nums = [10]
- 输出: 0
- 解释: 数组元素个数小于 2,因此返回 0。
提示:
- 1 <= nums.length <= 105
- 0 <= nums[i] <= 109
解法一:基数排序
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
|
func max(nums ...int) int {
res := nums[0]
for _, num := range nums {
if num > res {
res = num
}
}
return res
}
func maximumGap(nums []int) int {
n := len(nums)
maxVal, exp := max(nums...), 1
buf := make([]int, n)
for maxVal >= exp {
cnt := make([]int, 10)
for i := 0; i < n; i++ {
digit := nums[i] / exp % 10
cnt[digit]++
}
for i := 1; i < 10; i++ {
cnt[i] += cnt[i-1]
}
for i := n - 1; i >= 0; i-- {
digit := nums[i] / exp % 10
buf[cnt[digit]-1] = nums[i]
cnt[digit]--
}
copy(nums, buf)
exp *= 10
}
ans := 0
for i := 1; i < n; i++ {
if nums[i]-nums[i-1] > ans {
ans = nums[i] - nums[i-1]
}
}
return ans
}
|
解法二:桶排序
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
|
type pair struct{ min, max int }
func maximumGap(nums []int) (ans int) {
n := len(nums)
if n < 2 {
return
}
minVal := min(nums...)
maxVal := max(nums...)
d := max(1, (maxVal-minVal)/(n-1))
bucketSize := (maxVal-minVal)/d + 1
// 存储 (桶内最小值,桶内最大值) 对,(-1, -1) 表示该桶是空的
buckets := make([]pair, bucketSize)
for i := range buckets {
buckets[i] = pair{-1, -1}
}
for _, v := range nums {
bid := (v - minVal) / d
if buckets[bid].min == -1 {
buckets[bid].min = v
buckets[bid].max = v
} else {
buckets[bid].min = min(buckets[bid].min, v)
buckets[bid].max = max(buckets[bid].max, v)
}
}
prev := -1
for i, b := range buckets {
if b.min == -1 {
continue
}
if prev != -1 {
ans = max(ans, b.min-buckets[prev].max)
}
prev = i
}
return
}
func min(a ...int) int {
res := a[0]
for _, v := range a[1:] {
if v < res {
res = v
}
}
return res
}
func max(a ...int) int {
res := a[0]
for _, v := range a[1:] {
if v > res {
res = v
}
}
return res
}
|