leetcode 2017. 网格游戏(C++、java、python)

给你一个下标从 0 开始的二维数组 grid ,数组大小为 2 x n ,其中 grid[r][c] 表示矩阵中 (r, c) 位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。

两个机器人初始位置都是 (0, 0) ,目标位置是 (1, n-1) 。每个机器人只会 向右 ((r, c) 到 (r, c + 1)) 或 向下 ((r, c) 到 (r + 1, c)) 。

游戏开始,第一个 机器人从 (0, 0) 移动到 (1, n-1) ,并收集路径上单元格的全部点数。对于路径上所有单元格 (r, c) ,途经后 grid[r][c] 会重置为 0 。然后,第二个 机器人从 (0, 0) 移动到 (1, n-1) ,同样收集路径上单元的全部点数。注意,它们的路径可能会存在相交的部分。

第一个 机器人想要打击竞争对手,使 第二个 机器人收集到的点数 最小化 。与此相对,第二个 机器人想要 最大化 自己收集到的点数。两个机器人都发挥出自己的 最佳水平 的前提下,返回 第二个 机器人收集到的 点数 

示例 1:

输入:grid = [[2,5,4],[1,5,1]]
输出:4
解释:第一个机器人的最佳路径如红色所示,第二个机器人的最佳路径如蓝色所示。
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 + 0 + 4 + 0 = 4 个点。

示例 2:

输入:grid = [[3,3,1],[8,5,2]]
输出:4
解释:第一个机器人的最佳路径如红色所示,第二个机器人的最佳路径如蓝色所示。 
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 + 3 + 1 + 0 = 4 个点。

示例 3:

输入:grid = [[1,3,1,15],[1,3,3,1]]
输出:7
解释:第一个机器人的最佳路径如红色所示,第二个机器人的最佳路径如蓝色所示。
第一个机器人访问过的单元格将会重置为 0 。
第二个机器人将会收集到 0 + 1 + 3 + 3 + 0 = 7 个点。

提示:

  • grid.length == 2
  • n == grid[r].length
  • 1 <= n <= 5 * 104
  • 1 <= grid[r][c] <= 105

C++

class Solution {
public:
    long long gridGame(vector<vector<int>> &grid) {
        int n = grid[0].size();
        vector<long> up(n, 0);
        vector<long> down(n, 0);
        up[n - 1] = grid[0][n - 1];
        down[0] = grid[1][0];
        for (int i = n - 2; i >= 0; i--) {
            up[i] = up[i + 1] + grid[0][i];
        }
        for (int i = 1; i < n; i++) {
            down[i] = down[i - 1] + grid[1][i];
        }
        long res = min(up[1], down[n - 2]);
        for (int i = 1; i < n - 1; i++) {
            res = min(res, max(up[i + 1], down[i - 1]));
        }
        return res;
    }
};

java

class Solution {
    public long gridGame(int[][] grid) {
        int n = grid[0].length;
        long[] up = new long[n];
        long[] down = new long[n];
        up[n - 1] = grid[0][n - 1];
        down[0] = grid[1][0];
        for (int i = n - 2; i >= 0; i--) {
            up[i] = up[i + 1] + grid[0][i];
        }
        for (int i = 1; i < n; i++) {
            down[i] = down[i - 1] + grid[1][i];
        }
        long res = Math.min(up[1], down[n - 2]);
        for (int i = 1; i < n - 1; i++) {
            res = Math.min(res, Math.max(up[i + 1], down[i - 1]));
        }
        return res;
    }
}

python

class Solution:
    def gridGame(self, grid: List[List[int]]) -> int:
        n = len(grid[0])
        up = [0] * n
        down = [0] * n
        up[n - 1] = grid[0][n - 1]
        down[0] = grid[1][0]
        for i in range(n - 2, -1, -1):
            up[i] += up[i + 1] + grid[0][i]
        for i in range(1, n):
            down[i] += down[i - 1] + grid[1][i]
        res = min(up[1], down[n - 2])
        for i in range(1, n - 1):
            res = min(res, max(up[i + 1], down[i - 1]))
        return res

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/120558597