题目地址:
https://leetcode.com/problems/minimum-swaps-to-make-sequences-increasing/description/
给定两个长 n n n数组 A A A和 B B B,保证 n ≥ 2 n\ge 2 n≥2。每一次可以选择某个位置 i i i,让 A [ i ] A[i] A[i]和 B [ i ] B[i] B[i]交换位置。问至少换几次可以使得两个数组都严格单调增。题目保证解一定存在。
参考https://blog.csdn.net/qq_46105170/article/details/113777285。代码如下:
class Solution {
public:
int minSwap(vector<int>& a, vector<int>& b) {
int n = a.size();
int f[n], g[n];
memset(f, 0, sizeof f);
memset(g, 0, sizeof g);
g[0] = 1;
for (int i = 1; i < n; i++) {
if (a[i] > a[i - 1] && b[i] > b[i - 1]) {
if (a[i] > b[i - 1] && b[i] > a[i - 1]) {
f[i] = min(f[i - 1], g[i - 1]);
g[i] = min(f[i - 1], g[i - 1]) + 1;
} else {
f[i] = f[i - 1];
g[i] = g[i - 1] + 1;
}
} else {
f[i] = g[i - 1];
g[i] = f[i - 1] + 1;
}
}
return min(f[n - 1], g[n - 1]);
}
};
时空复杂度 O ( n ) O(n) O(n)。