2017. 网格游戏

139 阅读1分钟

题目:
leetcode.cn/problems/gr…

算法:
方法一:前缀和
不用先求第一个 机器人取得最大值。关键在于理清楚第一个机器人走了之后,第二个机器人何时取得最大值。
不失一般性,我们可以假设第一个机器人走了一个Z字行,image.png
那么,第二个机器人何时能取得最大值呢?假设第一个机器人在j位置移动到第二行,第二个机器人要么在第一行横着走到底,要么在第二行横着走到底。那么对于每一个j的位置,我们计算(第二个机器人要么在第一行横着走到底,要么在第二行横着走到底)这两种情况第二个机器人能取得的最小值即可。

func gridGame(grid [][]int) int64 {
    n := len(grid[0])
    preSum0, preSum1 := make([]int,n + 1), make([]int,n + 1)
    for i := 1; i <= n; i ++ {
        preSum0[i] = preSum0[i - 1] + grid[0][i - 1]
        preSum1[i] = preSum1[i - 1] + grid[1][i - 1]
    }


    ans := math.MaxInt64
    for i := 1; i <= n; i ++ {
        grid0Max := preSum0[n] - preSum0[i]
        grid1Max := preSum1[i - 1]
        ans = min(max(grid1Max, grid0Max), ans)
    }
    return int64(ans)
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}