|
@@ -1,9 +1,57 @@
|
|
|
package main
|
|
|
|
|
|
func maximumGap(nums []int) int {
|
|
|
- return 0
|
|
|
+ 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() {
|
|
|
-
|
|
|
-}
|
|
|
+// 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)
|
|
|
+// }
|