📑 题目:164. 最大间距

🚀 本题 LeetCode 传送门

题目大意

在数组中找到 2 个数字之间最大的间隔。要求尽量用 O(1) 的时间复杂度和空间复杂度。

解题思路

虽然使用排序算法可以 AC 这道题。先排序,然后依次计算数组中两两数字之间的间隔,找到最大的一个间隔输出即可。

这道题满足要求的做法是基数排序。

代码

  1. package leetcode
  2. // 解法一 快排
  3. func maximumGap(nums []int) int {
  4. if len(nums) < 2 {
  5. return 0
  6. }
  7. quickSort164(nums, 0, len(nums)-1)
  8. res := 0
  9. for i := 0; i < len(nums)-1; i++ {
  10. if (nums[i+1] - nums[i]) > res {
  11. res = nums[i+1] - nums[i]
  12. }
  13. }
  14. return res
  15. }
  16. func partition164(a []int, lo, hi int) int {
  17. pivot := a[hi]
  18. i := lo - 1
  19. for j := lo; j < hi; j++ {
  20. if a[j] < pivot {
  21. i++
  22. a[j], a[i] = a[i], a[j]
  23. }
  24. }
  25. a[i+1], a[hi] = a[hi], a[i+1]
  26. return i + 1
  27. }
  28. func quickSort164(a []int, lo, hi int) {
  29. if lo >= hi {
  30. return
  31. }
  32. p := partition164(a, lo, hi)
  33. quickSort164(a, lo, p-1)
  34. quickSort164(a, p+1, hi)
  35. }
  36. // 解法二 基数排序
  37. func maximumGap1(nums []int) int {
  38. if nums == nil || len(nums) < 2 {
  39. return 0
  40. }
  41. // m is the maximal number in nums
  42. m := nums[0]
  43. for i := 1; i < len(nums); i++ {
  44. m = max(m, nums[i])
  45. }
  46. exp := 1 // 1, 10, 100, 1000 ...
  47. R := 10 // 10 digits
  48. aux := make([]int, len(nums))
  49. for (m / exp) > 0 { // Go through all digits from LSB to MSB
  50. count := make([]int, R)
  51. for i := 0; i < len(nums); i++ {
  52. count[(nums[i]/exp)%10]++
  53. }
  54. for i := 1; i < len(count); i++ {
  55. count[i] += count[i-1]
  56. }
  57. for i := len(nums) - 1; i >= 0; i-- {
  58. tmp := count[(nums[i]/exp)%10]
  59. tmp--
  60. aux[tmp] = nums[i]
  61. count[(nums[i]/exp)%10] = tmp
  62. }
  63. for i := 0; i < len(nums); i++ {
  64. nums[i] = aux[i]
  65. }
  66. exp *= 10
  67. }
  68. maxValue := 0
  69. for i := 1; i < len(aux); i++ {
  70. maxValue = max(maxValue, aux[i]-aux[i-1])
  71. }
  72. return maxValue
  73. }
  74. func max(a int, b int) int {
  75. if a > b {
  76. return a
  77. }
  78. return b
  79. }