题目大意
我们有两个长度相等且不为空的整型数组 A 和 B 。
我们可以交换 A[i] 和 B[i] 的元素。注意这两个元素在各自的序列中应该处于相同的位置。
在交换过一些元素之后,数组 A 和 B 都应该是严格递增的(数组严格递增的条件仅为A[0] < A[1] < A[2] < … < A[A.length - 1])。
给定数组 A 和 B ,请返回使得两个数组均保持严格递增状态的最小交换次数。假设给定的输入总是有效的。
示例:
输入: A = [1,3,5,4], B = [1,2,3,7]
输出: 1
解释:
交换 A[3] 和 B[3] 后,两个数组如下:
A = [1, 3, 5, 7] , B = [1, 2, 3, 4]
两个数组均为严格递增的。
注意:
- A, B 两个数组的长度总是相等的,且长度的范围为 [1, 1000]。
- A[i], B[i] 均为 [0, 2000]区间内的整数。
解题思路
具体注释代码中都写出来了,直接看代码更容易理解。
class Solution {
public:
int minSwap(vector<int>& A, vector<int>& B) {
if (A.size() < 2)
return 0;
// cost.first表示不交换i位置元素时,所需的最少交换次数
// cost.second表示交换i位置元素时,所需的最少交换次数
// 初始化
pair<int, int> cost = {0, 1};
for (int i = 1; i < A.size(); ++i){
// 满足这个条件,可以不交换i位置的元素(只是可以不换,没说一定不能换)
if (A[i] > A[i - 1] && B[i] > B[i - 1]){
// 再满足这个条件,可换可不换,都能够满足单调递增要求
if (A[i] > B[i - 1] && B[i] > A[i - 1]){
int tmp = cost.first;
// 如果不交换当前i位置元素,i-1位置的元素可以交换,可以不交换,取二者较小值
cost.first = min(cost.first, cost.second);
// 如果交换当前i位置元素,i-1位置元素同样可换可不换
cost.second = min(tmp, cost.second) + 1;
}
// 否则,i位置和i-1位置元素必须同时交换或者不交换
else{
// 如果不交换i位置元素,那么i-1位置元素也不能交换
cost.first = cost.first;
// 如果交换i位置元素,那么i-1位置元素也交换
cost.second = cost.second + 1;
}
}
// 否则,需要交换元素,即i位置和i-1位置必须有一个位置需要交换才行
else{
int tmp = cost.first;
// 如果不交换i位置的元素,那只能交换i-1位置的元素
cost.first = cost.second;
// 如果交换i位置的元素,i-1位置的元素就不能交换
cost.second = tmp + 1;
}
}
return min(cost.first, cost.second);
}
};