題目描述:
給定一個 2 x n 的網格 grid,兩個機器人從左上角 (0,0) 出發到右下角 (1,n-1),只能向右或向下移動。第一個機器人先走,走過的格子歸零。第二個機器人接著走,收集剩餘的分數。第一個機器人的目標是最小化第二個機器人能獲得的分數。求第二個機器人在最優策略下能獲得的最大分數(即第一個機器人最優時的結果)。
解題思路:
j 從第 0 行向下到第 1 行,之後一直向右。grid[0][j+1] + ... + grid[0][n-1](第一個機器人未走的第 0 行後段)grid[1][0] + ... + grid[1][j-1](第一個機器人未走的第 1 行前段)j,O(n) 即可解決。時間複雜度:O(n) — 一次遍歷計算所有轉折點。
空間複雜度:O(1) — 僅使用常數額外空間。
1. Compute topSuffix = sum of entire row 0 2. Set botPrefix = 0, ans = infinity 3. For each column j from 0 to n-1: a. topSuffix -= grid[0][j] (remaining row 0 after column j) b. robot2Score = max(topSuffix, botPrefix) c. ans = min(ans, robot2Score) d. botPrefix += grid[1][j] (row 1 before column j+1) 4. Return ans
前綴和陣列法 O(n):預先計算兩行的前綴和陣列,然後枚舉轉折點。邏輯相同,但使用 O(n) 額外空間儲存前綴和。
二分搜尋法 O(n log S):二分答案 S,檢查是否存在轉折點使第二個機器人得分不超過 S。但由於直接枚舉已是 O(n),二分搜尋並無優勢。
m x n(多行),問題變成怎樣?還能用類似方法嗎?