1
1
// Time: O(k * (m + n + k)) ~ O(k * (m + n + k^2))
2
2
// Space: O(m + n + k^2)
3
3
4
- // DP + Greedy solution. (48ms)
4
+ // DP + Greedy solution.
5
5
class Solution {
6
6
public:
7
7
vector<int > maxNumber (vector<int >& nums1, vector<int >& nums2, int k) {
8
- vector<int > res (k);
9
8
const int m = nums1.size (), n = nums2.size ();
10
- vector<vector<int >> max_digits1 (k + 1 ), max_digits2 (k + 1 );
11
- getMaxDigits (nums1, max (0 , k - n), min (k, m), &max_digits1); // O(k * m) time, O(m + k^2) space.
12
- getMaxDigits (nums2, max (0 , k - m), min (k, n), &max_digits2); // O(k * n) time, O(n + k^2) space.
13
- for (int i = max (0 , k - n); i <= min (k, m); ++i) { // k * O(k) ~ k * O(k^2) time.
14
- int j = k - i;
9
+ vector<vector<int >> max_numbers1 (k + 1 ), max_numbers2 (k + 1 );
10
+ maxNumberDP (nums1, max (0 , k - n), min (k, m), &max_numbers1); // O(k * m) time, O(m + k^2) space.
11
+ maxNumberDP (nums2, max (0 , k - m), min (k, n), &max_numbers2); // O(k * n) time, O(n + k^2) space.
12
+
13
+ vector<int > res (k);
14
+ for (int i = max (0 , k - n); i <= min (k, m); ++i) { // k * O(k) ~ k * O(k^2) time
15
15
vector<int > tmp (k);
16
- merge (max_digits1 [i], max_digits2[j ], &tmp);
16
+ merge (max_numbers1 [i], max_numbers2[k - i ], &tmp);
17
17
if (tmp > res) {
18
18
res = move (tmp);
19
19
}
20
20
}
21
21
return res;
22
22
}
23
-
24
23
private:
25
- void getMaxDigits (vector<int > nums, int start, int end, vector<vector<int >> *maxDigits ) {
26
- (*maxDigits )[end] = maxDigit (nums, end);
24
+ void maxNumberDP (vector<int > nums, int start, int end, vector<vector<int >> *max_numbers ) {
25
+ (*max_numbers )[end] = maxNumber (nums, end);
27
26
for (int i = end - 1 ; i >= start; --i) {
28
- (*maxDigits )[i] = deleteDigit ((*maxDigits )[i + 1 ]);
27
+ (*max_numbers )[i] = deleteNumber ((*max_numbers )[i + 1 ]);
29
28
}
30
29
}
31
30
32
31
// Time: O(n)
33
32
// Space: O(n)
34
- vector<int > maxDigit (const vector<int >& nums, int k) {
33
+ vector<int > maxNumber (const vector<int >& nums, int k) {
35
34
vector<int > res;
36
35
int drop = nums.size () - k;
37
36
for (const auto & num : nums) {
@@ -47,7 +46,7 @@ class Solution {
47
46
48
47
// Time: O(n)
49
48
// Space: O(n)
50
- vector<int > deleteDigit (const vector<int >& nums) {
49
+ vector<int > deleteNumber (const vector<int >& nums) {
51
50
vector<int > res (nums);
52
51
for (int i = 0 ; i < res.size (); ++i) {
53
52
if (i == res.size () - 1 || res[i] < res[i + 1 ]) {
@@ -65,30 +64,20 @@ class Solution {
65
64
first2 = vec2.begin (), last2 = vec2.end ();
66
65
auto result = res->begin ();
67
66
while (first1 != last1 || first2 != last2) {
68
- int val1 = first1 != last1 ? *first1 : numeric_limits<int >::min ();
69
- int val2 = first2 != last2 ? *first2 : numeric_limits<int >::min ();
70
- if (val1 > val2) {
67
+ if (greater (first1, last1, first2, last2)) {
71
68
*result++ = *first1++;
72
- } else if (val1 < val2) {
73
- *result++ = *first2++;
74
69
} else {
75
- auto pos1 = first1 + 1 , pos2 = first2 + 1 ;
76
- while (pos1 != last1 || pos2 != last2) { // O(1) ~ O(k) time.
77
- int val1 = (pos1 != last1) ? *(pos1) : numeric_limits<int >::min ();
78
- int val2 = (pos2 != last2) ? *(pos2) : numeric_limits<int >::min ();
79
- if (val1 > val2) {
80
- *result++ = *first1++;
81
- break ;
82
- } else if (val1 < val2) {
83
- *result++ = *first2++;
84
- break ;
85
- }
86
- ++pos1, ++pos2;
87
- }
88
- if (pos1 == last1 && pos2 == last2) {
89
- *result++ = *first2++;
90
- }
70
+ *result++ = *first2++;
91
71
}
92
72
}
93
73
}
74
+
75
+ template <typename IT>
76
+ bool greater (IT first1, IT last1, IT first2, IT last2) {
77
+ while (first1 != last1 && first2 != last2 && *first1 == *first2) {
78
+ ++first1;
79
+ ++first2;
80
+ }
81
+ return (first2 == last2) || (first1 != last1 && *first1 > *first2);
82
+ }
94
83
};
0 commit comments