「力扣」第 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]);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章