#力扣 LeetCode1025. 除數博弈 @FDDLC
阿新 • • 發佈:2021-02-09
技術標籤:演算法&資料結構
題目描述:
https://leetcode-cn.com/problems/divisor-game/
Java程式碼:
class Solution { //0 < x < N 且 N % x == 0
public boolean divisorGame(int N) {
return N%2==0;
}
}
說明:
用1到10去找規律,發現輸贏跟奇偶有關:
N=1時,先手輸,因為沒有選擇;
N=2時,先手從1到N-1中選一個N的約數,只有1,後手沒有選擇,故先手贏。記住這裡,誰先碰到2,誰就贏!
如果N>2:
N為奇數時,N的約數x必為奇數,故N-x為偶數。也就是說,碰到奇數的人,他無法改變餘下的數的奇偶性,因為餘下的數只能為偶數!
接下來,另一個人要面對一個偶數:
碰到偶數的人如果發現這個偶數是2,那麼他就贏了!
如果這個偶數不是2,即是大於2的偶數,他有選擇奇偶的主動權:他可以讓餘下的數變成奇數(比如選1),也可以讓餘下的數變成偶數(比如選2)。
既然主動權在自己手上,肯定要選對自己最有利的。而對自己最有利的就是讓餘下的數變成奇數(比如選1),這樣在對方選完後下回自己又會碰到偶數。因為數一直在變小,所以總有一回自己會碰到2,從而鎖定勝局!