leetcode 464. Can I Win
464. Can I Win
https://www.cnblogs.com/grandyang/p/6103525.html
用递归的方式进行搜索,用hash表减少搜索的次数。因为数字不超过20,所以可以用一个int的位来表示是否访问过。
注意:
(cur & used) == 0这个地方必须加括号,不然就报错了。
class Solution { public: bool canIWin(int maxChoosableInteger, int desiredTotal) { if(maxChoosableInteger >= desiredTotal) return true; if((1 + maxChoosableInteger) * maxChoosableInteger/2 < desiredTotal) return false; unordered_map<int,bool> m; return canIWin(maxChoosableInteger,desiredTotal,0,m); } bool canIWin(int maxChoosableInteger, int desiredTotal,int used,unordered_map<int,bool>& m){ if(m.find(used) != m.end()) return m[used]; for(int i = 1;i <= maxChoosableInteger;i++){ int tmp = 1 << (i-1); if((tmp&used) == 0){ if(desiredTotal <= i || !canIWin(maxChoosableInteger,desiredTotal - i,used|tmp,m)){ m[used] = true; return true; } } } m[used] = false; return false; } };