321.create-maximum-number.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. func maxNumber(nums1 []int, nums2 []int, k int) []int {
  2. m, n := len(nums1), len(nums2)
  3. max := make([]int, m+n)
  4. for i := maxInt(0, k-n); i <= minInt(k, m); i++ {
  5. num := merge(pick(nums1, i), pick(nums2, k-i))
  6. if less(max, num) {
  7. max = num
  8. }
  9. }
  10. return max
  11. }
  12. func less(nums1, nums2 []int) bool {
  13. for i := range nums1 {
  14. if nums1[i] < nums2[i] {
  15. return true
  16. } else if nums2[i] < nums1[i] {
  17. return false
  18. }
  19. }
  20. return false
  21. }
  22. func pick(nums []int, k int) []int {
  23. n := len(nums)
  24. st := make([]int, 0)
  25. loop:
  26. for i := 0; i < n; i++ {
  27. for {
  28. if l := len(st); l+n-i == k {
  29. st = append(st, nums[i:]...)
  30. break loop
  31. } else if 0 < l && st[l-1] < nums[i] {
  32. st = st[:l-1]
  33. } else {
  34. st = append(st, nums[i])
  35. break
  36. }
  37. }
  38. }
  39. return st[:k]
  40. }
  41. func merge(nums1, nums2 []int) []int {
  42. m, n := len(nums1), len(nums2)
  43. res := make([]int, m+n)
  44. i, i1, i2 := 0, 0, 0
  45. for mv1 := false; i1 < m && i2 < n; i++ {
  46. if nums1[i1] < nums2[i2] {
  47. mv1 = false
  48. } else if nums2[i2] < nums1[i1] {
  49. mv1 = true
  50. } else {
  51. for j1, j2, n1, n2 := i1+1, i2+1, 0, 0; (j1 < m || j2 < n) && n1 == n2; j1, j2 = j1+1, j2+1 {
  52. if m <= j1 {
  53. n1 = 0
  54. } else {
  55. n1 = nums1[j1]
  56. }
  57. if n <= j2 {
  58. n2 = 0
  59. } else {
  60. n2 = nums2[j2]
  61. }
  62. if n1 < n2 {
  63. mv1 = false
  64. } else if n2 < n1 {
  65. mv1 = true
  66. }
  67. }
  68. }
  69. if mv1 {
  70. res[i] = nums1[i1]
  71. i1++
  72. } else {
  73. res[i] = nums2[i2]
  74. i2++
  75. }
  76. }
  77. if i1 != m {
  78. copy(res[i:], nums1[i1:])
  79. }
  80. if i2 != n {
  81. copy(res[i:], nums2[i2:])
  82. }
  83. return res
  84. }
  85. func maxInt(x, y int) int {
  86. if x < y {
  87. return y
  88. }
  89. return x
  90. }
  91. func minInt(x, y int) int {
  92. if x < y {
  93. return x
  94. }
  95. return y
  96. }