前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang Leetcode 321. Create Maximum Number.go

Golang Leetcode 321. Create Maximum Number.go

作者头像
anakinsun
发布2019-04-12 14:01:45
3620
发布2019-04-12 14:01:45
举报
文章被收录于专栏:学习日记学习日记

版权声明:原创勿转 https://cloud.tencent.com/developer/article/1412955

思路

这是一个Hard难度的题目,整个问题可以拆分成几个步骤:

1)从一个长度为N的数组中抽取最大的包含 i 个元素的数组;

2)将两个长度分别为M和N的数组 合并 成最大的一个数组;

3)i从0到K遍历,找到最优的解。 i 具体的最小值是 0 和 K-nums2.size() 之间的最大值,i 的最大值同理计算

code

代码语言:javascript
复制
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
}

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年04月07日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 思路
  • code
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档