↓快轉到主要內容
  1. LeetCode/

LeetCode 1025: Divisor Game

·1 分鐘· ·
LeetCode Easy Math Dynamic-Programming Brainteaser Game-Theory
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-27

  • 提交紀錄:Accepted ×2 → Runtime Error ×2 → Wrong Answer → Accepted ×3

解題思路
#

博弈 DP:dp[i] 表示面對 i 時先手會不會贏,只要存在 x | i、x < i 讓 dp[i - x] 是 False(對手輸)就贏。跑出來會發現 dp[i] 剛好就是 i 是偶數(Linear DP 裡的「標了 DP,但觀察更快」):偶數可以拿 1 讓對手面對奇數;奇數的因數都是奇數,拿完一定剩偶數給對手。

我的嘗試
#

2022-09 第一次就用 n % 2 == 0 AC 了。2022-11 想練 DP 版本:

  • 先寫成 [False] * len(n)(整數沒有長度),接著 index 超出範圍。
  • 修好之後外層迴圈是 range(n),dp[n] 本身沒有算到,永遠是 False:n = 2 回傳 False。改成 range(n + 1) 就 AC 了。

正確解法
#

class Solution:
    def divisorGame(self, n: int) -> bool:
        return n % 2 == 0

複雜度
#

時間 O(1),空間 O(1);DP 版本是 O(n²)。

要特別避免的錯誤
#

  • DP 的迴圈要包含 n 本身:range(n + 1)。
  • 陣列長度是 n + 1,不是 len(n)。

面試口說整理
#

可以用 DP,dp[i] 是存在一個因數 x 讓對手面對 i - x 會輸;但觀察後發現偶數可以拿 1 讓對手面對奇數,而奇數的因數都是奇數,拿完一定剩偶數,所以答案就是 n 是不是偶數。

相關文章

LeetCode 292: Nim Game
·1 分鐘
LeetCode Easy Math Brainteaser Minimax-Algorithm Game-Theory
LeetCode 292 解題筆記:剩 4 的倍數顆石頭的人必輸,所以 n % 4 != 0 時先手贏
LeetCode 509: Fibonacci Number
·1 分鐘
LeetCode Easy Math Dynamic-Programming Recursion Memoization
LeetCode 509 解題筆記:一維 DP 的起點:只需要前兩項,用兩個變數滾動
LeetCode 989: Add to Array-Form of Integer
·1 分鐘
LeetCode Easy Array Math
LeetCode 989 解題筆記:把 k 當成進位,從陣列最後一位往前加,k 還沒用完就繼續往前補位
LeetCode 908: Smallest Range I
·1 分鐘
LeetCode Easy Array Math
LeetCode 908 解題筆記:最大值往下調 k、最小值往上調 k,答案是 max(0, max - min - 2k)
LeetCode 914: X of a Kind in a Deck of Cards
·1 分鐘
LeetCode Easy Array Hash-Table Math Counting
LeetCode 914 解題筆記:每種卡片的張數都要能被同一個 X >= 2 整除,也就是所有張數的 GCD >= 2
LeetCode 892: Surface Area of 3D Shapes
·1 分鐘
LeetCode Easy Array Math Geometry Matrix
LeetCode 892 解題筆記:每疊 v 個方塊有 4v + 2 個面,再扣掉跟上方和左方相鄰的疊重疊的 2 × min 面