zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
  • 相关阅读:
    电路的耦合方式
    PCBA与PCB的区别
    vue记住密码功能
    数组变异
    element时间选择器插件转化为YYYY-MM-DD的形式
    box-shadow
    从后台传select的值
    jQuery事件(持续更新中)
    JavaScript对象(持续更新中)
    15分XX秒后订单自动关闭(倒计时)
  • 原文地址:https://www.cnblogs.com/a1439775520/p/12946097.html
Copyright © 2011-2022 走看看