-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmakeArrayStrictlyIncreasing.cpp
More file actions
36 lines (33 loc) · 1.27 KB
/
makeArrayStrictlyIncreasing.cpp
File metadata and controls
36 lines (33 loc) · 1.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// Source: https://leetcode.com/problems/make-array-strictly-increasing/
// Author: Miao Zhang
// Date: 2021-04-16
class Solution {
public:
int makeArrayIncreasing(vector<int>& arr1, vector<int>& arr2) {
int kInf = 1e9;
int m = arr1.size();
sort(begin(arr2), end(arr2));
arr2.resize(unique(begin(arr2), end(arr2)) - begin(arr2));
int n = arr2.size();
vector<int> keep(m, kInf);
keep[0] = 0;
vector<vector<int>> swap(m, vector<int>(n, kInf));
fill(begin(swap[0]), end(swap[0]), 1);
for (int i = 1; i < m; i++) {
int minkeep = kInf;
int minswap = kInf;
for (int j = 0; j < n; j++) {
if (j > 0) minswap = min(minswap, swap[i - 1][j - 1] + 1);
if (arr1[i] > arr2[j]) minkeep = min(minkeep, swap[i - 1][j]);
if (arr1[i] > arr1[i - 1]) keep[i] = keep[i - 1];
if (arr2[j] > arr1[i - 1]) swap[i][j] = keep[i - 1] + 1;
swap[i][j] = min(swap[i][j], minswap);
keep[i] = min(keep[i], minkeep);
}
}
int s = *min_element(begin(swap.back()), end(swap.back()));
int k = keep.back();
int res = min(s, k);
return res >= kInf ? -1: res;
}
};