123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- 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
- }
|