leetcode801.使序列递增的最小交换次数

题目大意

我们有两个长度相等且不为空的整型数组 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);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_41092190/article/details/106939743