MarcusV(南墙大佬的搬运工)

南墙大佬的CSDN博客地址

导航

Java实现 LeetCode 801 使序列递增的最小交换次数 (DP)

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

我们有两个长度相等且不为空的整型数组 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]区间内的整数。

PS:
其实这个题换成正常的动态规划就明白了,但是空间占用太高,导致效率很低
所以就用两个值保存上一步的操作,如果有看不懂的欢迎评论,
最近事情比较多,可能要晚上或者间隙的时间才能回复,但有时间我一定会回复的

class Solution {
  public int minSwap(int[] A, int[] B) {
        int n1 = 0, s1 = 1;//n1,s1一直都是保存的上一次的操作
        //n1表示的是上一步不交换的操作,s1保存的是上一步交换的操作
        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因为附上了最大值所有只能是n1,因为是取最小的
                n2 = n1;
                //因为符合条件了,才能进行交换
                s2 = s1 + 1;
            } 
            if (A[i-1] < B[i] && B[i-1] < A[i]) {
                //这个是当前这一步不换,选择这一步不换的,或者选上一步换了的,因为满足换的条件了,两者选最小
                n2 = Math.min(n2, s1);
                //这个是当前这一步换,选当前这一步换,或者,上一步不换的+1就是这一步换
                //如果没符合上面那个条件,s2是最大值,是不可能被选到的
                s2 = Math.min(s2, n1 + 1);
            }
            n1 = n2;
            s1 = s2;
        }
        return Math.min(n1, s1);
    }
}

posted on 2020-05-07 22:18  MarcusV  阅读(144)  评论(0编辑  收藏  举报