|
@@ -0,0 +1,101 @@
|
|
|
+func maxNumber(nums1 []int, nums2 []int, k int) []int {
|
|
|
+ m, n := len(nums1), len(nums2)
|
|
|
+ max := make([]int, m+n)
|
|
|
+ for i := maxInt(0, k-n); i <= minInt(k, m); i++ {
|
|
|
+ num := merge(pick(nums1, i), pick(nums2, k-i))
|
|
|
+ if less(max, num) {
|
|
|
+ max = num
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return max
|
|
|
+}
|
|
|
+
|
|
|
+func less(nums1, nums2 []int) bool {
|
|
|
+ for i := range nums1 {
|
|
|
+ if nums1[i] < nums2[i] {
|
|
|
+ return true
|
|
|
+ } else if nums2[i] < nums1[i] {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false
|
|
|
+}
|
|
|
+
|
|
|
+func pick(nums []int, k int) []int {
|
|
|
+ n := len(nums)
|
|
|
+ st := make([]int, 0)
|
|
|
+loop:
|
|
|
+ for i := 0; i < n; i++ {
|
|
|
+ for {
|
|
|
+ if l := len(st); l+n-i == k {
|
|
|
+ st = append(st, nums[i:]...)
|
|
|
+ break loop
|
|
|
+ } else if 0 < l && st[l-1] < nums[i] {
|
|
|
+ st = st[:l-1]
|
|
|
+ } else {
|
|
|
+ st = append(st, nums[i])
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return st[:k]
|
|
|
+}
|
|
|
+
|
|
|
+func merge(nums1, nums2 []int) []int {
|
|
|
+ m, n := len(nums1), len(nums2)
|
|
|
+ res := make([]int, m+n)
|
|
|
+ i, i1, i2 := 0, 0, 0
|
|
|
+ for mv1 := false; i1 < m && i2 < n; i++ {
|
|
|
+ if nums1[i1] < nums2[i2] {
|
|
|
+ mv1 = false
|
|
|
+ } else if nums2[i2] < nums1[i1] {
|
|
|
+ mv1 = true
|
|
|
+ } else {
|
|
|
+ for j1, j2, n1, n2 := i1+1, i2+1, 0, 0; (j1 < m || j2 < n) && n1 == n2; j1, j2 = j1+1, j2+1 {
|
|
|
+ if m <= j1 {
|
|
|
+ n1 = 0
|
|
|
+ } else {
|
|
|
+ n1 = nums1[j1]
|
|
|
+ }
|
|
|
+ if n <= j2 {
|
|
|
+ n2 = 0
|
|
|
+ } else {
|
|
|
+ n2 = nums2[j2]
|
|
|
+ }
|
|
|
+ if n1 < n2 {
|
|
|
+ mv1 = false
|
|
|
+ } else if n2 < n1 {
|
|
|
+ mv1 = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if mv1 {
|
|
|
+ res[i] = nums1[i1]
|
|
|
+ i1++
|
|
|
+ } else {
|
|
|
+ res[i] = nums2[i2]
|
|
|
+ i2++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if i1 != m {
|
|
|
+ copy(res[i:], nums1[i1:])
|
|
|
+ }
|
|
|
+ if i2 != n {
|
|
|
+ copy(res[i:], nums2[i2:])
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+func maxInt(x, y int) int {
|
|
|
+ if x < y {
|
|
|
+ return y
|
|
|
+ }
|
|
|
+ return x
|
|
|
+}
|
|
|
+
|
|
|
+func minInt(x, y int) int {
|
|
|
+ if x < y {
|
|
|
+ return x
|
|
|
+ }
|
|
|
+ return y
|
|
|
+}
|