思路
这是一个Hard难度的题目,整个问题可以拆分成几个步骤:
1)从一个长度为N的数组中抽取最大的包含 i 个元素的数组;
2)将两个长度分别为M和N的数组 合并 成最大的一个数组;
3)i从0到K遍历,找到最优的解。[ i 具体的最小值是 0 和 K-nums2.size() 之间的最大值,i 的最大值同理计算]
code
func maxNumber(nums1 []int, nums2 []int, k int) []int {
ans := []int{}
if len(nums1) == 0 && len(nums2) == 0 {
return ans
}
if len(nums1) == 0 {
return nums2[:k]
}
if len(nums2) == 0 {
return nums1[:k]
}
for i := 0; i < k; i++ {
if i > len(nums1) || k-i > len(nums2) {
continue
}
m := mergeArray(maxArray(nums1, i), maxArray(nums2, k-i))
if arrayToStr(ans) < arrayToStr(m) {
ans = m
}
}
return ans
}
//数组转换成字符串,用于比较大小
func arrayToStr(nums []int) string {
ret := ""
str := []string{}
if len(nums) == 0 {
return ret
}
for _, v := range nums {
str = append(str, strconv.Itoa(v))
}
return strings.Join(str, "")
}
//合并两个数组,不改变顺序的情况下,获得一个最大的数组
func mergeArray(nums1, nums2 []int) []int {
if len(nums1) == 0 {
return nums2
}
if len(nums2) == 0 {
return nums1
}
ans := []int{}
i, j := 0, 0
for i < len(nums1) && j < len(nums2) {
if bigArray(nums1[i:], nums2[j:]) {
ans = append(ans, nums1[i])
i++
} else {
ans = append(ans, nums2[j])
j++
}
}
if i < len(nums1) {
ans = append(ans, nums1[i:]...)
}
if j < len(nums2) {
ans = append(ans, nums2[j:]...)
}
return ans
}
//取数组中前k个最大的值
func maxArray(nums []int, k int) []int {
ans := []int{}
if k == 0 {
return ans
}
l := len(nums)
toPop := 0
if l <= k {
return nums
} else {
toPop = l - k
}
for _, v := range nums {
for len(ans) > 0 && v > ans[len(ans)-1] && toPop > 0 {
ans = ans[:len(ans)-1]
toPop--
}
ans = append(ans, v)
}
return ans[:k]
}
//比较两个数组的大小,如果前一个大于后一个,返回true
func bigArray(nums1, nums2 []int) bool {
l1, l2 := len(nums1), len(nums2)
l := 0
if l1 > l2 {
l = l2
} else {
l = l1
}
for i := 0; i < l; i++ {
if nums1[i] == nums2[i] {
continue
}
if nums1[i] > nums2[i] {
return true
} else {
return false
}
}
if l1 > l2 {
return true
}
return false
}
更多内容请移步我的repo:https://github.com/anakin/golang-leetcode