Skip to content

Commit 1dc0dcd

Browse files
authored
Create can-i-win.cpp
1 parent ed803ef commit 1dc0dcd

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

C++/can-i-win.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Time: O(n!)
2+
// Space: O(n)
3+
4+
class Solution {
5+
public:
6+
bool canIWin(int maxChoosableInteger, int desiredTotal) {
7+
if ((1 + maxChoosableInteger) * (maxChoosableInteger / 2) < desiredTotal) {
8+
return false;
9+
}
10+
unordered_map<int, int> lookup;
11+
return canIWinHelper(maxChoosableInteger, desiredTotal, 0, &lookup);
12+
}
13+
14+
private:
15+
int canIWinHelper(int maxChoosableInteger, int desiredTotal,
16+
int visited, unordered_map<int, int> *lookup) {
17+
18+
if (lookup->find(visited) != lookup->end()) {
19+
return (*lookup)[visited];
20+
}
21+
int mask = 1;
22+
for (int i = 0; i < maxChoosableInteger; ++i) {
23+
if (!(visited & mask)) {
24+
if (i + 1 >= desiredTotal ||
25+
!canIWinHelper(maxChoosableInteger, desiredTotal - (i + 1), visited | mask, lookup)) {
26+
(*lookup)[visited] = true;
27+
return true;
28+
}
29+
}
30+
mask <<= 1;
31+
}
32+
(*lookup)[visited] = false;
33+
return false;
34+
}
35+
};

0 commit comments

Comments
 (0)