2017-网格游戏

Raphael Liu Lv10

给你一个下标从 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

解题思路

截屏2021-09-26 12.17.14.png
如图所示,假设第一个机器人走红色的线路,那么第二个机器人最多只能拿到最多第一行蓝线的和或者第二行蓝线的和。
所以第一个机器人的任务就是使两条蓝线和的最大值最小。
可以使用前缀和来快速计算蓝线的和,枚举即可。
时间复杂度:O(N)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public long gridGame(int[][] grid) {
int n = grid[0].length;
long[][] p = new long[2][n + 1];
for(int i = 1; i <= n; i++) {
p[0][i] = p[0][i - 1] + grid[0][i - 1];
p[1][i] = p[1][i - 1] + grid[1][i - 1];
}
long ans = Long.MAX_VALUE;
for(int i = 1; i <= n; i++) {
ans = Math.min(ans, Math.max(p[0][n] - p[0][i], p[1][i - 1]));
}
return ans;
}
}
 Comments
On this page
2017-网格游戏