从Leetcode 每日一题练习继续讨论:
题解
本题注意机器人只能向右或者向下移动,因此经过的路径具有很明确的方向性,还要注意一个非常重要的条件,即grid矩阵只有两行,只有两行意味着第一个机器人只能选择在某个位置向下移动后一直向右移动,也就意味着第一个机器人在第一行只会从开头移动到中间某个位置i,而在第二行则会从i开始一直向后移动到第二行末尾。只有两行这个条件的存在使得问题大大简化,因为第二个机器人在移动时要么选择获得第一行从i开始向后的全部位置的数字,要么选择从第二行开头开始到i-1的全部位置的数字。则要想使得第二个机器人能得到的总和尽可能小,就要使从i开始到末尾的和与第二行从开头到i的和都尽可能小。则可以计算出两行的前缀和和两行的总和,对每个i,都计算出第一行从i到末尾的和与第二行从开头到i-1的和并比较二者,取二者中较大的值(第二个机器人会选择更大的路径),并与记录的全局记录值比较,如果比全局记录更小则更新全局记录。最后返回全局记录。
如果本题是三行或者更多,则这种解法就不适用了,因此只有两行是一个很重要的条件。
代码
class Solution {
public:
long long gridGame(vector<vector<int>>& grid) {
long long int row1 = 0;
long long int row2 = 0;
int cols = grid[0].size();
vector<long long int> prefix1(cols+1,0);
vector<long long int> prefix2(cols+1,0);
for(int i=0;i<cols;i++){
row1 += grid[0][i];
prefix1[i+1] = row1;
row2 += grid[1][i];
prefix2[i+1] = row2;
}
long long int current = 0;
long long int result = LLONG_MAX ;
for(int i=1;i<=cols;i++){
current = max(row1-prefix1[i],prefix2[i-1]);
result = min(result, current);
}
return result;
}
};