LeetCode 801. 使序列递增的最小交换次数--动态规划

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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值