123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package main
- func maximumGap(nums []int) int {
- n := len(nums)
- if n < 2 {
- return 0
- }
- min, max := nums[0], nums[0]
- for i := 1; i < n; i++ {
- if nums[i] < min {
- min = nums[i]
- }
- if nums[i] > max {
- max = nums[i]
- }
- }
- minMaxGap := (max - min) / (n - 1)
- if minMaxGap == 0 {
- minMaxGap++
- }
- bucketNum := (max-min)/minMaxGap + 1 // Bucket sort, divide the whole area into buckets
- bucketMin := make([]int, bucketNum)
- bucketMax := make([]int, bucketNum)
- used := make([]bool, bucketNum)
- for i := 0; i < n; i++ {
- idx := (nums[i] - min) / minMaxGap
- if !used[idx] {
- bucketMin[idx] = nums[i]
- bucketMax[idx] = nums[i]
- used[idx] = true
- continue
- }
- if nums[i] < bucketMin[idx] {
- bucketMin[idx] = nums[i]
- }
- if nums[i] > bucketMax[idx] {
- bucketMax[idx] = nums[i]
- }
- }
- prevBucketMax, maxGap := min, 0
- for i := 0; i < bucketNum; i++ {
- if used[i] {
- if bucketMin[i]-prevBucketMax > maxGap {
- maxGap = bucketMin[i] - prevBucketMax
- }
- prevBucketMax = bucketMax[i]
- }
- }
- return maxGap
- }
- // func main() {
- // println(maximumGap([]int{3, 6, 9, 1}), 3)
- // println(maximumGap([]int{1, 1, 1, 1}), 0)
- // println(maximumGap([]int{100, 3, 2, 1}), 97)
- // println(maximumGap([]int{10}), 0)
- // }
|