「力扣」第 801 题:使序列递增的最小交换次数(动态规划)

https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/chai-jie-guan-fang-ti-jie-tong-su-yi-dong-by-xxley/

https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/dong-tai-gui-hua-jie-shi-liao-yi-xia-zhi-qian-mei-/

https://leetcode-cn.com/problems/minimum-swaps-to-make-sequences-increasing/solution/c-dong-tai-gui-hua-by-bant-2-2/

Java 代码:

import java.util.Arrays;

public class Solution {

    public int minSwap(int[] A, int[] B) {
        int len = A.length;
        int[][] dp = new int[len][2];

        // 初始化特别重要
        for (int i = 0; i < len; i++) {
            Arrays.fill(dp[i], Integer.MAX_VALUE);
        }

        // dp[i][0]:A 和 B 在区间 [0, i] 严格递增,且在下标 i 位置不发生交换的次数
        // dp[i][1]:A 和 B 在区间 [0, i] 严格递增,且在下标 i 位置发生交换的次数

        dp[0][0] = 0;
        // 1 个元素一定有序,由于一定发送交换,因此初始化为 1
        dp[0][1] = 1;

        for (int i = 1; i < len; i++) {
            // 在下标 i 位置已经有序
            if (A[i - 1] < A[i] && B[i - 1] < B[i]) {
                // 什么都不用做
                dp[i][0] = Math.min(dp[i][0], dp[i - 1][0]);
                // 上一步是交换过的,这一步一定是交换的
                dp[i][1] = Math.min(dp[i][1], dp[i - 1][1] + 1);
            }

            // 交错相等的情况下
            if (A[i - 1] < B[i] && B[i - 1] < A[i]) {
                dp[i][0] = Math.min(dp[i][0], dp[i - 1][1]);
                dp[i][1] = Math.min(dp[i][1], dp[i - 1][0] + 1);
            }
        }
        return Math.min(dp[len - 1][0], dp[len - 1][1]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章