微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

[Swift]LeetCode321. 拼接最大数 | Create Maximum Number

Given two arrays of length m and n with digits 0-9 representing two numbers. Create the maximum number of length k <= m + n from digits of the two. The relative order of the digits from the same array must be preserved. Return an array of the k digits.

Note: You should try to optimize your time and space complexity.

Example 1:

Input:
nums1 = 
nums2 = 
k = 
Output:
[3,4,6,5][9,1,2,5,8,3]5[9,3]

Example 2:

Input:
nums1 = 
nums2 = 
k = 
Output:
[6,7][6,4]5[6,7,4]

Example 3:

Input:
nums1 = 
nums2 = 
k = 
Output:
[3,9][8,9]3[9,9]

说明: 请尽可能地优化你算法的时间和空间复杂度。

示例 1:

输入:
nums1 = 
nums2 = 
k = 
输出:
[3,3]

示例 2:

输入:
nums1 = 
nums2 = 
k = 
输出:
[6,4]

示例 3:

输入:
nums1 = 
nums2 = 
k = 
输出:
[3,9]
380 ms

 1 class Solution {
 2     func maxnumber(_ nums1: [Int],_ nums2: [Int],_ k: Int) -> [Int] {
 3         let m = nums1.count
 4         let n = nums2.count
 5         
 6         var res = [Int]()
 7         
 8         let c = max(0,k-n)
 9         
10         for i in c...min(k,m) {
11             let r1 = maxnumArr(nums1,i)
12             let r2 = maxnumArr(nums2,k-i)
13             let tmp = maxnums(r1,r2,k)
14             if isGreater(tmp,res,0,0) {
15                 res = tmp
16             }
17         }
18         
19         return res
20     }
21     
22     func maxnumArr(_ nums : [Int],_ k : Int) -> [Int] {
23         var res = [Int]()
24         for i in 0..<nums.count {
25             let num = nums[i]
26             while !res.isEmpty && num > res.last! && nums.count + res.count > k + i {
27                 res.removeLast()
28             }
29             res.append(num)
30             continue
31         }
32         return res
33     }
34     
35     func maxnums(_ num1 : [Int],_ num2 : [Int],_ k : Int) -> [Int] {
36         var res = [Int]()
37         var i = 0,j = 0
38         for _ in 0..<k {
39             if isGreater(num1,num2,i,j) {
40                 res.append(num1[i])
41                 i+=1
42             }else {
43                 res.append(num2[j])
44                 j+=1
45             }
46         }
47         
48         return res
49     }
50     
51     func isGreater(_ nums1: [Int],_ nums2 : [Int],_ i : Int,_ j : Int) -> Bool {
52         var i = i,j = j
53         while i < nums1.count,j < nums2.count && nums1[i] == nums2[j] {
54             i+=1
55             j+=1
56         }
57         
58         return j == nums2.count || (i < nums1.count && nums1[i] > nums2[j])
59     }
60 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐