-
初刷时间:2023.9.27
-
解题思路:
-
动态规划
-
只需要考虑相邻元素的大小关系
-
令a1 = nums1[i-1], a2 = nums1[i], b1 = nums2[i-1], b2 = nums2[i]
-
如果a1 < a2 且 b1 < b2,i-1和i位置可以同时交换或同时不交换,因此满足:
- f[i][0] = f[i-1][0]
- f[i][1] = f[i-1][1] + 1
-
如果 a1 < b2 且 b1 < a2, i-1 和 i 位置可以交换其中的任意一个,因此满足:
- f[i][0] = f[i-1][1]
- f[i][1] = f[i-1][0] + 1
-
当上述两点同时满足时,取其中更小值
-
-
解题代码:
class Solution {
public:
int minSwap(vector<int>& nums1, vector<int>& nums2) {
/*
只需要考虑相邻元素间的大小关系
*/
int n = nums1.size();
vector<vector<int>> f(n, vector<int>(2, INT_MAX));
f[0][0] = 0;
f[0][1] = 1;
for(int i = 1; i < n; i++)
{
int a1 = nums1[i-1];
int a2 = nums1[i];
int b1 = nums2[i-1];
int b2 = nums2[i];
if(a1 < a2 && b1 < b2)
{
f[i][0] = f[i-1][0];
f[i][1] = f[i-1][1] + 1;
}
if(a1 < b2 && b1 < a2)//可以交换其中一对
{
f[i][0] = min(f[i][0], f[i-1][1]);
f[i][1] = min(f[i][1], f[i-1][0] + 1);
}
}
return min(f[n-1][0], f[n-1][1]);
}
};