1. 程式人生 > >LeetCode演算法題-Nim Game(Java實現)

LeetCode演算法題-Nim Game(Java實現)

這是悅樂書的第203次更新,第213篇原創

01 看題和準備

你和你的朋友正在玩下面的Nim遊戲:桌子上有一堆石頭,每次你輪流去除1到3塊石頭。 移除最後一塊石頭的人將成為贏家。 你是第一個取出石塊的。

你們兩個都非常聰明,並且擁有最佳的遊戲策略。 編寫一個函式來確定你是否可以在堆中的石頭數量的情況下贏得遊戲。例如:

輸入:4
輸出:false

說明:如果堆中有4塊石頭,那麼你永遠不會贏得遊戲;無論你刪除了1,2或3塊石頭,你的朋友都能去除它。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 解題

這道題有點像排列組合,給定一個整數n,在1到3之間進行隨機組合,判斷能否在奇數次移除石頭的組合下,將n變為0。當n等於1,2,3時,你都可以一次將其移除。當n等於4的時候,你無論怎麼移都會輸。當n等於5的時候,第一次移動一塊,剩下4塊給另外一個人移除,另外一個人就會陷入4的死局,你就能在第二次移除的時候贏,當n等於6和7的時候,結局是一樣的。當n等於8的時候,結局和n等於4一樣,怎麼選都會輸。對此,只要是4的倍數,都是輸局,所以簡單的判斷就變成了n對4取餘是否等於0。

public boolean canWinNim(int n) {
    if (n <= 4) {
        return n == 1 || n == 2 || n == 3;
    }
    return n%4 != 0;
}

此解法的時間複雜度是O(1),空間複雜度是O(1)

03 小結

演算法專題目前已連續日更超過二個月,演算法題文章69+篇,公眾號對話方塊回覆【資料結構與演算法】、【演算法】、【資料結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!