164.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package main
  2. func maximumGap(nums []int) int {
  3. n := len(nums)
  4. if n < 2 {
  5. return 0
  6. }
  7. min, max := nums[0], nums[0]
  8. for i := 1; i < n; i++ {
  9. if nums[i] < min {
  10. min = nums[i]
  11. }
  12. if nums[i] > max {
  13. max = nums[i]
  14. }
  15. }
  16. minMaxGap := (max - min) / (n - 1)
  17. if minMaxGap == 0 {
  18. minMaxGap++
  19. }
  20. bucketNum := (max-min)/minMaxGap + 1 // Bucket sort, divide the whole area into buckets
  21. bucketMin := make([]int, bucketNum)
  22. bucketMax := make([]int, bucketNum)
  23. used := make([]bool, bucketNum)
  24. for i := 0; i < n; i++ {
  25. idx := (nums[i] - min) / minMaxGap
  26. if !used[idx] {
  27. bucketMin[idx] = nums[i]
  28. bucketMax[idx] = nums[i]
  29. used[idx] = true
  30. continue
  31. }
  32. if nums[i] < bucketMin[idx] {
  33. bucketMin[idx] = nums[i]
  34. }
  35. if nums[i] > bucketMax[idx] {
  36. bucketMax[idx] = nums[i]
  37. }
  38. }
  39. prevBucketMax, maxGap := min, 0
  40. for i := 0; i < bucketNum; i++ {
  41. if used[i] {
  42. if bucketMin[i]-prevBucketMax > maxGap {
  43. maxGap = bucketMin[i] - prevBucketMax
  44. }
  45. prevBucketMax = bucketMax[i]
  46. }
  47. }
  48. return maxGap
  49. }
  50. // func main() {
  51. // println(maximumGap([]int{3, 6, 9, 1}), 3)
  52. // println(maximumGap([]int{1, 1, 1, 1}), 0)
  53. // println(maximumGap([]int{100, 3, 2, 1}), 97)
  54. // println(maximumGap([]int{10}), 0)
  55. // }