- 使序列递增的最小交换次数
我们有两个长度相等且不为空的整型数组 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]区间内的整数。
题解
很有趣的题目,其实比较好理解的,因为每个位置无非就两种状态:交换和不交换。
然后我们需要比较的时候交换和不交换情况下,当前位置和前面的位置需要满足题目的要求:严格递增,然后进行动态规划就行了。
AC代码
class Solution {
public:
int dp[100005][2];//dp[x][0]表示不交换位置x得到的最小交换次数
int minSwap(vector<int>& nums1, vector<int>& nums2)
{
memset(dp,0x3f3f3f,sizeof(dp));
dp[0][0]=0,dp[0][1]=1;
for(int i=1;i<nums1.size();i++)
{
//做4种情况的比较,前面一个位置换和不换与当前位置换和不换,4种情况
if(nums1[i]>nums1[i-1]&&nums2[i]>nums2[i-1])//当前和上一个位置都不换并且符合要求的情况下
{
dp[i][0]=min(dp[i][0],dp[i-1][0]);
}
if(nums1[i]>nums2[i-1]&&nums2[i]>nums1[i-1])//当前位置不交换,上一个位置交换并且符合要求的情况下
{
dp[i][0]=min(dp[i][0],dp[i-1][1]);
}
if(nums2[i]>nums1[i-1]&&nums1[i]>nums2[i-1])//当前位置交换,上一个位置不交换并且符合要求的情况下
{
dp[i][1]=min(dp[i][1],dp[i-1][0]+1);
}
if(nums2[i]>nums2[i-1]&&nums1[i]>nums1[i-1])//当前位置和上一个位置都交换并且符合题目要求的情况下
{
dp[i][1]=min(dp[i][1],dp[i-1][1]+1);
}
}
return min(dp[nums1.size()-1][0],dp[nums1.size()-1][1]);
}
};