1025. 除數博弈

愛麗絲和鮑勃一塊兒玩遊戲,他們輪流行動。愛麗絲先手開局。閉包

最初,黑板上有一個數字 N 。在每一個玩家的回合,玩家須要執行如下操做:函數

選出任一 x,知足 0 < x < N 且 N % x == 0 。
用 N - x 替換黑板上的數字 N 。
若是玩家沒法執行這些操做,就會輸掉遊戲。spa

只有在愛麗絲在遊戲中取得勝利時才返回 True,不然返回 false。假設兩個玩家都以最佳狀態參與遊戲。code

 

示例 1:blog

輸入:2
輸出:true
解釋:愛麗絲選擇 1,鮑勃沒法進行操做。
示例 2:遊戲

輸入:3
輸出:false
解釋:愛麗絲選擇 1,鮑勃也選擇 1,而後愛麗絲沒法進行操做。
 leetcode

提示:io

1 <= N <= 1000function

 

解答1

能夠使用閉包把dict變量放到函數裏面。這裏的思路就是逐級取反。class

let dict = {
};

var divisorGame = function(N) {
  if(N == 1) {
    dict[N] = false;
    return false;
  }
  for(let i=1; i<N; ++i) {
    if(N % i != 0) continue;
    dict[N] = (N-i) in dict ? !dict[N-i] : !divisorGame(N-i);
    if(dict[N]) {
      return true;
    }
  }
  return false;
};

 

解答2

求出(N-1)的全部解,而後遞推出N的解

var divisorGame = function (N) {
  let result = [];
  result[1] = false;
  for(let i=2; i<=N; ++i) {
    for(let j=1; j<i; ++j) {
      if(i % j != 0) continue;
      if(!result[i-j]) {
        result[i] = true;
        break;
      } else {
        result[i] = false;
      }
    }
  }
  return result[N];
}

 

解答3(來自leetcode官方解答)

數字N若是是奇數,它的約數必然都是奇數;若爲偶數,則其約數可奇可偶。
不管N初始爲多大的值,遊戲最終只會進行到N=2時結束,那麼誰輪到N=2時誰就會贏。
由於愛麗絲先手,N初始若爲偶數,愛麗絲則只需一直選1,使鮑勃一直面臨N爲奇數的狀況,這樣愛麗絲穩贏;
N初始若爲奇數,那麼愛麗絲第一次選完以後N必爲偶數,那麼鮑勃只需一直選1就會穩贏。

var divisorGame = function (N) {
  return N % 2 == 0;
}
相關文章
相關標籤/搜索