最后更新于
最后更新于
给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k <= m + n) 个数字拼接成一个新的数,要求从同一个数组中取出的数字保持其在原数组中的相对顺序。
求满足该条件的最大数。结果返回一个表示该最大数的长度为 k 的数组。
说明: 请尽可能地优化你算法的时间和空间复杂度。
示例 1:
示例 2:
示例 3:
剩下要做的就是将这个长度分别为 k1 和 k2 的数字,合并成一个长度为 k 的数组合并成一个最大的数组。方法为比较两个数组第一个数字, 如果相等, 则继续向后比较, 分出大小之后将对应数组的第一个数字入栈.
这种方法运用了分治思想, 在num1和num2中找各自指定数量的最大子序列是对应的分, 而结果合并成一个数组为治.
具体算法为:
将 A 和 B 按照上面的 merge 方法合并
上面我们暴力了 k 种组合情况,我们只需要将 k 种情况取出最大值即可。
假设我们从第一个数组num1
中取了k1
个, 从num2
中取了k2
个, 有k1+k2=k
. 而 k1 和 k2 这 两个子问题, 可以参考中的方法来解决. 由于这两个子问题是相互独立的,因此我们只需要分别求解,然后将结果合并即可.
从nums1
中取个数形成新的数组A,其中等于 0,1,2, ... k。
从nums2
中对应取个数形成新的数组B,其中等于。
时间复杂度为, 是要选择的位数, 是num1
的长度, 是num2
的长度.