464 我能贏嗎

2021-09-26 02:21:21 字數 1242 閱讀 1704

在 "100 game" 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。

如果我們將遊戲規則改為 「玩家不能重複使用整數」 呢?

例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數(不放回),直到累計整數和 >= 100。

給定乙個整數maxchoosableinteger(整數池中可選擇的最大數)和另乙個整數desiredtotal(累計和),判斷先出手的玩家是否能穩贏(假設兩位玩家遊戲時都表現最佳)?

你可以假設maxchoosableinteger不會大於 20,desiredtotal不會大於 300。

示例:

輸入:

maxchoosableinteger = 10

desiredtotal = 11

輸出:false

解釋:無論第乙個玩家選擇哪個整數,他都會失敗。

第乙個玩家可以選擇從 1 到 10 的整數。

如果第乙個玩家選擇 1,那麼第二個玩家只能選擇從 2 到 10 的整數。

第二個玩家可以通過選擇整數 10(那麼累積和為 11 >= desiredtotal),從而取得勝利.

同樣地,第乙個玩家選擇任意其他整數,第二個玩家都會贏。

思路:使用雜湊表來記錄已經計算過的結果。

1、如果給定的數字範圍大於等於目標值的話,直接返回 true。

2、如果給定的數字總和小於目標值的話,說明誰也沒法贏,返回 false。

3、然後我們進入遞迴函式,首先我們查詢當前情況是否在 hashmap 中存在,有的話直接返回結果。

沒有的話就需要求了:

由於maxchoosableinteger不會大於 20,我們使用乙個整型數used按位來記錄陣列中的某個數字是否使用過。遍歷所有沒有使用過的數字,如果此時的目標值小於等於當前數字,或者呼叫遞迴函式,如果返回 false,說明已經贏了。如果遍歷完所有數字,都沒找到,則標記 false,並返回 false。

class solution }}

m[used]=false;

return false;

}bool caniwin(int maxchoosableinteger, int desiredtotal)

};

464 我能贏嗎

在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙個整數...

leetcode 464 我能贏嗎

題目 在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙...

leetcode 464 我能贏嗎?

在 100 game 這個遊戲中,兩名玩家輪流選擇從 1 到 10 的任意整數,累計整數和,先使得累計整數和達到 100 的玩家,即為勝者。如果我們將遊戲規則改為 玩家不能重複使用整數 呢?例如,兩個玩家可以輪流從公共整數池中抽取從 1 到 15 的整數 不放回 直到累計整數和 100。給定乙個整數...