由前面注意的点可以推断出:【假设 a = nums1[i], b = nums1[i-1], c = nums2[i], d = nums2[i-1]】
在当前位置 a >= b and a >= d 且两个等号不会同时成立,同理 c >= b and c >= d。
假设 a == b,则必定有 a > d (反过来不成立),此时只能够选择交换,而不能够选择保持原样(也就是不能选择不交换);假若 a == d,则必定不能够选择交换;如果 a > b and a > d 则可以选择交换也可以选择不交换。
因此考虑用动态规划来解决此题,增多一个状态,新状态为交换操作,也就是 dp[i][0] 代表不交换操作,dp[i][1] 代表交换操作,如果 a > b and a > d,则状态转移的情况为 dp[i][0] = min(dp[i-1][0], dp[i-1][1]), dp[i][1] = min(dp[i-1][0], dp[i-1][1])+1。
代码实现:
classSolution{public:intminSwap(vector<int>& nums1, vector<int>& nums2){int m = nums1.size();
vector<vector<int>>dp(m,vector<int>(2, INT_MAX));
dp[0][0]=0, dp[0][1]=1;for(int i =1; i < m;++i){int a = nums1[i-1], b = nums1[i];int c = nums2[i-1], d = nums2[i];if(a < b and c < d)// 这种判断是为了避免 a == b or c == d 的情况
dp[i][0]= dp[i-1][0],dp[i][1]= dp[i-1][1]+1;if(a < d and c < b){
dp[i][0]=min(dp[i][0], dp[i-1][1]);
dp[i][1]=min(dp[i][1], dp[i-1][0]+1);}}returnmin(dp[m-1][0], dp[m-1][1]);}};