diff --git a/Algorithms/164. Maximum Gap/164. Maximum Gap.go b/Algorithms/164. Maximum Gap/164. Maximum Gap.go new file mode 100644 index 00000000..d1ac0420 --- /dev/null +++ b/Algorithms/164. Maximum Gap/164. Maximum Gap.go @@ -0,0 +1,85 @@ +package leetcode + +func maximumGap(nums []int) int { + if len(nums) < 2 { + return 0 + } + quickSort__(nums, 0, len(nums)-1) + + res := 0 + for i := 0; i < len(nums)-1; i++ { + if (nums[i+1] - nums[i]) > res { + res = nums[i+1] - nums[i] + } + } + return res +} + +func partition__(a []int, lo, hi int) int { + pivot := a[hi] + i := lo - 1 + for j := lo; j < hi; j++ { + if a[j] < pivot { + i++ + a[j], a[i] = a[i], a[j] + } + } + a[i+1], a[hi] = a[hi], a[i+1] + return i + 1 +} +func quickSort__(a []int, lo, hi int) { + if lo >= hi { + return + } + p := partition__(a, lo, hi) + quickSort__(a, lo, p-1) + quickSort__(a, p+1, hi) +} + +func maximumGap_(nums []int) int { + + if nums == nil || len(nums) < 2 { + return 0 + } + + // m is the maximal number in nums + m := nums[0] + for i := 1; i < len(nums); i++ { + m = max(m, nums[i]) + } + + exp := 1 // 1, 10, 100, 1000 ... + R := 10 // 10 digits + + aux := make([]int, len(nums)) + + for (m / exp) > 0 { // Go through all digits from LSB to MSB + count := make([]int, R) + + for i := 0; i < len(nums); i++ { + count[(nums[i]/exp)%10]++ + } + + for i := 1; i < len(count); i++ { + count[i] += count[i-1] + } + + for i := len(nums) - 1; i >= 0; i-- { + tmp := count[(nums[i]/exp)%10] + tmp-- + aux[tmp] = nums[i] + } + + for i := 0; i < len(nums); i++ { + nums[i] = aux[i] + } + exp *= 10 + } + + maxValue := 0 + for i := 1; i < len(aux); i++ { + maxValue = max(maxValue, aux[i]-aux[i-1]) + } + + return maxValue +} diff --git a/Algorithms/164. Maximum Gap/164. Maximum Gap_test.go b/Algorithms/164. Maximum Gap/164. Maximum Gap_test.go new file mode 100644 index 00000000..cb323f71 --- /dev/null +++ b/Algorithms/164. Maximum Gap/164. Maximum Gap_test.go @@ -0,0 +1,61 @@ +package leetcode + +import ( + "fmt" + "testing" +) + +type question164 struct { + para164 + ans164 +} + +// para 是参数 +// one 代表第一个参数 +type para164 struct { + one []int +} + +// ans 是答案 +// one 代表第一个答案 +type ans164 struct { + one int +} + +func Test_Problem164(t *testing.T) { + + qs := []question164{ + + question164{ + para164{[]int{3, 6, 9, 1}}, + ans164{3}, + }, + question164{ + para164{[]int{1}}, + ans164{0}, + }, + + question164{ + para164{[]int{}}, + ans164{0}, + }, + + question164{ + para164{[]int{2, 10}}, + ans164{8}, + }, + + question164{ + para164{[]int{2, 435, 214, 64321, 643, 7234, 7, 436523, 7856, 8}}, + ans164{372202}, + }, + } + + fmt.Printf("------------------------Leetcode Problem 164------------------------\n") + + for _, q := range qs { + _, p := q.ans164, q.para164 + fmt.Printf("【input】:%v 【output】:%v\n", p, maximumGap_(p.one)) + } + fmt.Printf("\n\n\n") +} diff --git a/Algorithms/164. Maximum Gap/README.md b/Algorithms/164. Maximum Gap/README.md new file mode 100644 index 00000000..8380e263 --- /dev/null +++ b/Algorithms/164. Maximum Gap/README.md @@ -0,0 +1,43 @@ +# [164. Maximum Gap](https://leetcode.com/problems/maximum-gap/) + +## 题目 + +Given an unsorted array, find the maximum difference between the successive elements in its sorted form. + +Return 0 if the array contains less than 2 elements. + +Example 1: + +```c +Input: [3,6,9,1] +Output: 3 +Explanation: The sorted form of the array is [1,3,6,9], either + (3,6) or (6,9) has the maximum difference 3. +``` + +Example 2: + +```c +Input: [10] +Output: 0 +Explanation: The array contains less than 2 elements, therefore return 0. +``` + + +Note: + +- You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range. +- Try to solve it in linear time/space. + + +## 题目大意 + +在数组中找到 2 个数字之间最大的间隔。要求尽量用 O(1) 的时间复杂度和空间复杂度。 + +虽然使用排序算法可以 AC 这道题。先排序,然后依次计算数组中两两数字之间的间隔,找到最大的一个间隔输出即可。 + +这道题满足要求的做法是基数排序。 + + + +