2020米哈游春招笔试题

C 2020-5-15 2313

返回两个数组中相同数字不相交的最大连线数

        //给定两数组
        int[] a = {2, 5, 1, 2, 5};
        int[] b = {10, 5, 2, 1, 5, 2};
        //输出:3
        int[] a1 = {1, 2, 3};
        int[] b1 = {1, 3, 2};
        //输出:2
        int[] a2 = {2, 5, 1, 2, 5, 1, 3};
        int[] b2 = {10, 5, 2, 7, 5, 3, 3};
        //输出:4

答案:

   /**
         * 返回两个数组中相同数字不相交的最大连线数
         *
         * @param A int整型一维数组 整数集合A
         * @param B int整型一维数组 整数集合B
         * @return int整型
         */
        //暴力
        public int maxUncrossedLines(int[] A, int[] B) {
            int max = 0;
            for (int i = 0; i < A.length; i++) {
                int ti = i;
                int cnt = 0;
                int j = 0;
                while (ti < A.length && j < B.length) {
                    if (A[ti] == B[j]) {
                        cnt++;
                        ti++;
                    }
                    j++;
                }
                max = max > cnt ? max : cnt;
            }
            return max;
        }

        //dp[][]
        public int maxUncrossedLines2(int[] A, int[] B) {
            int alen = A.length;
            int blen = B.length;
            int max = 0;
            //dpij 代表从0-i,0-j的相同数字不相交的最大连线数
            int[][] dp = new int[alen + 1][blen + 1];
            if (A[0] == B[0])
                dp[0][0] = 1;
            for (int i = 1; i < alen; i++) {
                for (int j = 1; j < blen; j++) {
                    if (A[i] == B[j])
                        dp[i][j] = dp[i - 1][j - 1] + 1;
                    else
                        dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
            for (int i = 0; i < alen; i++) {
                for (int j = 0; j < blen; j++) {
                    System.out.printf(" " + dp[i][j]);
                }
                System.out.println();
            }
            return max;
        }

        //递归
        public int maxUncrossedLines3(int[] A, int[] B) {
            return helper(A, B, 0, 0);
        }

        public int helper(int[] a, int[] b, int i, int j) {
            if (i >= a.length || j >= b.length) {
                return 0;
            }
            if (a[i] == b[j])
                return helper(a, b, i + 1, j + 1) + 1;
            return Math.max(helper(a, b, i, j + 1), helper(a, b, i + 1, j));
        }

 

最新回复 (2)
  • C 2020-5-15
    2

    回头改改主题把comment的CSS冲突改掉

    更新:改好了

  • 慕容 2020-5-15
    3

    悄悄说一句,这题暴力模拟和NOIP难度差不多(