关于leetcode:上岸算法-I-LeetCode-Weekly-Contest-219解题报告

30次阅读

共计 1505 个字符,预计需要花费 4 分钟才能阅读完成。

No.1 较量中的配对次数

解题思路

模仿过程即可,较简略。

代码展现

class Solution {

public int numberOfMatches(int n) {
    int res = 0;
    while (n > 1) {
        res += n / 2;
        n = (n + 1) / 2;
    }
    return res;
}

}

No.2 十 - 二进制数的起码数目

解题思路

取决于最大的数字是多少。

代码展现

class Solution {public int minPartitions(String n) {
        int res = 0;
        for (int i = 0; i < n.length(); i++) {res = Math.max(res, n.charAt(i) - '0'); 
        }
        return res;
    }
}

No.3 石子游戏 VII

解题思路

区间动静布局问题。

定义状态: dp[i][j] 示意区间 [i, j] 的得分差值

状态转移: 当一个人面临 [i, j] 的状况时,在拿右边和拿左边之间抉择本人取得分数更大的状况,详见代码。

定义 prefixSum 示意前缀和以辅助计算。

代码展现

class Solution {

public int stoneGameVII(int[] stones) {
    int n = stones.length;
    int[] prefixSum = new int[n + 1];
    for (int i = 0; i < n; i++) {prefixSum[i + 1] = prefixSum[i] + stones[i];
    }
    int[][] dp = new int[n][n];
    for (int i = n - 1; i >= 0; --i) {for (int j = i; j < n; ++j) {if (i != j) {// 边界: dp[i][i] = 0
                dp[i][j] = Math.max(
                        // 拿了右边的
                        (prefixSum[j + 1] - prefixSum[i + 1]) - dp[i + 1][j],
                        // 拿了左边的
                        (prefixSum[j] - prefixSum[i]) - dp[i][j - 1]
                );
            }
        }
    }
    return dp[0][n - 1];
}

}

No.4 重叠长方体的最大高度

解题思路

该题目相似嵌套矩形的问题,而嵌套矩形问题又是最长回升子序列的变体,所以实质上和 LIS 问题没有太大区别。

定义状态: dp[i] 示意以 i 结尾的长方体上最高能重叠多高。

与解决二维一样地,先要对长方体进行排序,而后再递推求解。

留神最终答案是 max{dp}

代码展现

class Solution {

public int maxHeight(int[][] cuboids) {
    // 排序
    for (int[] c : cuboids) {Arrays.sort(c);
    }
    Arrays.sort(cuboids, (a, b) -> {if (a[0] != b[0])
            return Integer.compare(a[0], b[0]);
        if (a[1] != b[1])
            return Integer.compare(a[1], b[1]);
        return Integer.compare(a[2], b[2]);
    });
    // dp[i] 示意以第 i 个长方体为开端时,能重叠的最大高度
    int[] dp = new int[cuboids.length];
    for (int i = 0; i < cuboids.length; i++) {dp[i] = cuboids[i][2];
        for (int j = 0; j < i; j++)
            if (cuboids[j][0] <= cuboids[i][0] &&
                    cuboids[j][1] <= cuboids[i][1] &&
                    cuboids[j][2] <= cuboids[i][2]) {dp[i] = Math.max(dp[i], dp[j] + cuboids[i][2]);
            }
    }
    return Arrays.stream(dp).max().getAsInt();
}

}

正文完
 0