Skip to content

Commit beca11f

Browse files
authored
Update create-maximum-number.cpp
1 parent 4442314 commit beca11f

File tree

1 file changed

+24
-35
lines changed

1 file changed

+24
-35
lines changed

C++/create-maximum-number.cpp

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,36 @@
11
// Time: O(k * (m + n + k)) ~ O(k * (m + n + k^2))
22
// Space: O(m + n + k^2)
33

4-
// DP + Greedy solution. (48ms)
4+
// DP + Greedy solution.
55
class Solution {
66
public:
77
vector<int> maxNumber(vector<int>& nums1, vector<int>& nums2, int k) {
8-
vector<int> res(k);
98
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
1515
vector<int> tmp(k);
16-
merge(max_digits1[i], max_digits2[j], &tmp);
16+
merge(max_numbers1[i], max_numbers2[k - i], &tmp);
1717
if (tmp > res) {
1818
res = move(tmp);
1919
}
2020
}
2121
return res;
2222
}
23-
2423
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);
2726
for (int i = end - 1; i >= start; --i) {
28-
(*maxDigits)[i] = deleteDigit((*maxDigits)[i + 1]);
27+
(*max_numbers)[i] = deleteNumber((*max_numbers)[i + 1]);
2928
}
3029
}
3130

3231
// Time: O(n)
3332
// Space: O(n)
34-
vector<int> maxDigit(const vector<int>& nums, int k) {
33+
vector<int> maxNumber(const vector<int>& nums, int k) {
3534
vector<int> res;
3635
int drop = nums.size() - k;
3736
for (const auto& num : nums) {
@@ -47,7 +46,7 @@ class Solution {
4746

4847
// Time: O(n)
4948
// Space: O(n)
50-
vector<int> deleteDigit(const vector<int>& nums) {
49+
vector<int> deleteNumber(const vector<int>& nums) {
5150
vector<int> res(nums);
5251
for (int i = 0; i < res.size(); ++i) {
5352
if (i == res.size() - 1 || res[i] < res[i + 1]) {
@@ -65,30 +64,20 @@ class Solution {
6564
first2 = vec2.begin(), last2 = vec2.end();
6665
auto result = res->begin();
6766
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)) {
7168
*result++ = *first1++;
72-
} else if (val1 < val2) {
73-
*result++ = *first2++;
7469
} 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++;
9171
}
9272
}
9373
}
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+
}
9483
};

0 commit comments

Comments
 (0)