题目描述
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1]
输出: 3
解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:输入: [10]
输出: 0
解释: 数组元素个数小于 2,因此返回 0。
说明:你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
我的解题思路:不讲道理,一个sort一个遍历解决问题,白嫖一道困难题,完全忽略线性复杂度的问题,尴尬
func maximumGap(nums []int) int {
if len(nums)<2{
return 0
}
sort.Slice(nums, func(i, j int) bool {
return nums[i]<nums[j]
})
var maxNumber = nums[1]-nums[0]
for i:=1;i<len(nums)-1;i++{
var temp = nums[i+1]-nums[i]
if temp>maxNumber{
maxNumber = temp
}
}
return maxNumber
}
官方解题:线性复杂度排序就该想到桶排序或者基数排序,附上评论区写的桶排序较好理解的思路
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
}
复杂度分析
时间复杂度:O(N),其中 N 是数组的长度。注意到桶的数量为 (max-min)/d≈N−1=O(N)。
空间复杂度:O(N),其中 N是数组的长度。我们开辟的空间大小取决于桶的数量。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/maximum-gap/solution/zui-da-jian-ju-by-leetcode-solution/