|
4 | 4 | class Solution {
|
5 | 5 | public:
|
6 | 6 | int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
|
7 |
| - sort(arr2.begin(), arr2.end()); |
8 |
| - unordered_map<int, int> dp = {{-1, 0}}; |
9 |
| - for (const auto& i : arr1) { |
| 7 | + std::sort(arr2.begin(), arr2.end()); |
| 8 | + arr2.erase(std::unique(arr2.begin(), arr2.end()), arr2.end()); |
| 9 | + unordered_map<int, int> dp = {{0, arr1[0]}, {1, arr2[0]}}; |
| 10 | + for (int i = 1; i < arr1.size(); ++i) { |
10 | 11 | unordered_map<int, int> next_dp;
|
11 | 12 | for (const auto& [j, count] : dp) {
|
12 |
| - if (i > j) { |
13 |
| - if (!next_dp.count(i)) { |
14 |
| - next_dp[i] = dp[j]; |
| 13 | + if (dp[j] < arr1[i]) { |
| 14 | + if (!next_dp.count(j)) { |
| 15 | + next_dp[j] = arr1[i]; |
15 | 16 | } else {
|
16 |
| - next_dp[i] = min(next_dp[i], dp[j]); |
| 17 | + next_dp[j] = min(next_dp[j], arr1[i]); |
17 | 18 | }
|
18 | 19 | }
|
19 |
| - const auto& it = upper_bound(arr2.cbegin(), arr2.cend(), j); |
| 20 | + const auto& it = upper_bound(arr2.cbegin(), arr2.cend(), dp[j]); |
20 | 21 | if (it != arr2.cend()) {
|
21 |
| - if (!next_dp.count(*it)) { |
22 |
| - next_dp[*it] = dp[j] + 1; |
| 22 | + if (!next_dp.count(j + 1)) { |
| 23 | + next_dp[j + 1] = *it; |
23 | 24 | } else {
|
24 |
| - next_dp[*it] = min(next_dp[*it], dp[j] + 1); |
| 25 | + next_dp[j + 1] = min(next_dp[j + 1], *it); |
25 | 26 | }
|
26 | 27 | }
|
27 | 28 | }
|
28 | 29 | dp = move(next_dp);
|
29 | 30 | }
|
30 |
| - if (!dp.empty()) { |
31 |
| - return min_element(dp.cbegin(), dp.cend(), |
32 |
| - [](const auto& a, const auto& b) { |
33 |
| - return a.second < b.second; |
34 |
| - })->second; |
| 31 | + if (dp.empty()) { |
| 32 | + return -1; |
35 | 33 | }
|
36 |
| - return -1; |
| 34 | + return min_element(dp.cbegin(), dp.cend())->first; |
37 | 35 | }
|
38 | 36 | };
|
0 commit comments