1. 程式人生 > >[Swift]LeetCode321. 拼接最大數 | Create Maximum Number

[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 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
Output:
[9, 8, 6, 5, 3]

Example 2:

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

Example 3:

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

說明: 請儘可能地優化你演算法的時間和空間複雜度。

示例 1:

輸入:
nums1 = [3, 4, 6, 5]
nums2 = [9, 1, 2, 5, 8, 3]
k = 5
輸出:
[9, 8, 6, 5, 3]

示例 2:

輸入:
nums1 = [6, 7]
nums2 = [6, 0, 4]
k = 5
輸出:
[6, 7, 6, 0, 4]

示例 3:

輸入:
nums1 = [3, 9]
nums2 = [8, 9]
k = 3
輸出:
[9, 8, 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 }