?LeetCode刷題實(shí)戰(zhàn)464:我能贏嗎
示例? ? ? ?
? ? ? ? ? ? ? ? ? ? ?
輸入:
maxChoosableInteger = 10
desiredTotal = 11
輸出:
false
解釋?zhuān)?br mpa-from-tpl="t">無(wú)論第一個(gè)玩家選擇哪個(gè)整數(shù),他都會(huì)失敗。
第一個(gè)玩家可以選擇從 1?到 10?的整數(shù)。
如果第一個(gè)玩家選擇 1,那么第二個(gè)玩家只能選擇從 2?到 10?的整數(shù)。
第二個(gè)玩家可以通過(guò)選擇整數(shù) 10(那么累積和為 11?>= desiredTotal),從而取得勝利.
同樣地,第一個(gè)玩家選擇任意其他整數(shù),第二個(gè)玩家都會(huì)贏。
解題
class?Solution?{
public:
????bool?canIWin(int?maxChoosableInteger, int?desiredTotal)?{
????????if?(maxChoosableInteger >= desiredTotal) return?true;
????????if?(maxChoosableInteger * (maxChoosableInteger + 1) / 2?< desiredTotal) return?false;
????????unordered_map<int, bool> m;
????????return?canWin(maxChoosableInteger, desiredTotal, 0, m);
????}
????bool?canWin(int?length, int?total, int?used, unordered_map<int, bool>& m)?{
????????if?(m.count(used)) return?m[used];
????????for?(int?i = 0; i < length; ++i) {
????????????int?cur = (1?<< i);
????????????if?((cur & used) == 0) {
????????????????if?(total <= i + 1?|| !canWin(length, total - (i + 1), cur | used, m)) {
????????????????????m[used] = true;
????????????????????return?true;
????????????????}
????????????}
????????}
????????m[used] = false;
????????return?false;
????}
};
LeetCode1-460題匯總,希望對(duì)你有點(diǎn)幫助!
LeetCode刷題實(shí)戰(zhàn)461:漢明距離
LeetCode刷題實(shí)戰(zhàn)462:最少移動(dòng)次數(shù)使數(shù)組元素相等 II
LeetCode刷題實(shí)戰(zhàn)463:島嶼的周長(zhǎng)
