力扣-动态规划+贪心-801. 使序列递增的最小交换次数

801 https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/
在这里插入图片描述

这是一个dp+贪心的题,求最小交换次数,从“最小”两个字就能看出有点贪心的意思。
(1)两个数组的状态分两种情况:
令 a1 = A[i - 1], b1 = B[i - 1] 以及 a2 = A[i], b2 = B[i]。如果 a1 < a2 并且 b1 < b2,

  • A[i - 1] < A[i] 且 B[i - 1] < B[i],比如 A[i - 1] = 1 , A[i] = 3,B[i - 1] = 2, B[i] = 4
    ⭐这个状态就已经保证了前i个数字严格递增,不需要交换A[i],B[i],看下面这个例子就可以看出来可以不交换,那么你会说,交换A[i],B[i]也是可以的啊,是的,交换A[i],B[i]也可以,但是我们最后计算的是最小交换次数,因此我们只需要保存交换次数最小的状态就可以了,不需要计算所有可能状态。
    因此就有官方题解上的:n2 = min(n2, n1) 以及 s2 = min(s2, s1 + 1),而不是n2=min(n2,n1,n1+1),从这个式子中也可以看出来交换A[i],B[i]是没有必要的。那么你肯定会说可以不交换A[i],B[i],那么为什么还会有s2 = min(s2, s1 + 1)呢?我们现在只知道A[i],B[i]可以不交换,但是A[i - 1],B[i - 1]是否交换了,我们并不知道啊,而且s2和n2这是两个状态,它们互不影响的,我们最后找它们两个的最小值就好了。
初始:1 3  
	 2 4
  • A[i - 1] < B[i] 且 B[i - 1] < A[i]
    情况一和情况二是并列的哦。
    ⭐在满足情况二的情况下也有可能满足情况一,如果满足情况一,刚才我们已经计算过了,接下来,我们只需要考虑必须交换的情况就好了。
    必须要交换其中的一列,要么是 A[i - 1] 和 B[i - 1],要么是 A[i] 和 B[i]。n2 = min(n2, s1) 以及 s2 = min(s2, n1 + 1)。
class Solution {
    public int minSwap(int[] A, int[] B) {
        // n: natural, s: swapped
        int n1 = 0, s1 = 1;
        for (int i = 1; i < A.length; ++i) {
            int n2 = Integer.MAX_VALUE, s2 = Integer.MAX_VALUE;
            if (A[i-1] < A[i] && B[i-1] < B[i]) {
                n2 = Math.min(n2, n1);
                s2 = Math.min(s2, s1 + 1);
            }
            if (A[i-1] < B[i] && B[i-1] < A[i]) {
                n2 = Math.min(n2, s1);
                s2 = Math.min(s2, n1 + 1);
            }
            n1 = n2;
            s1 = s2;
        }
        return Math.min(n1, s1);
    }
}

作者:LeetCode
链接:https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/shi-xu-lie-di-zeng-de-zui-xiao-jiao-huan-ci-shu-by/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值