464. Can I Win

 

用递归的方式进行搜索,用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;
    }
};