Nim Game
EASYDescription
You are playing the following Nim Game with your friend:
- Initially, there is a heap of stones on the table.
- You and your friend will alternate taking turns, and you go first.
- On each turn, the person whose turn it is will remove 1 to 3 stones from the heap.
- The one who removes the last stone is the winner.
Given n, the number of stones in the heap, return true if you can win the game assuming both you and your friend play optimally, otherwise return false.
Example 1:
Input: n = 4 Output: false Explanation: These are the possible outcomes: 1. You remove 1 stone. Your friend removes 3 stones, including the last stone. Your friend wins. 2. You remove 2 stones. Your friend removes 2 stones, including the last stone. Your friend wins. 3. You remove 3 stones. Your friend removes the last stone. Your friend wins. In all outcomes, your friend wins.
Example 2:
Input: n = 1 Output: true
Example 3:
Input: n = 2 Output: true
Constraints:
1 <= n <= 231 - 1
Approaches
Checkout 3 different approaches to solve Nim Game. Click on different approaches to view the approach and algorithm in detail.
Recursive Solution
We can solve this problem using recursion by trying all possible moves and checking if any of them leads to a winning position.
Algorithm
- Check base cases:
- If n ≤ 0, return false
- If n ≤ 3, return true
- Recursively check if we can win by trying all possible moves
- Return true if any move leads to a winning position
In this approach, we use recursion to simulate all possible moves and determine if we can win. For each turn:
-
Base cases:
- If n = 0, return false (no stones left)
- If n = 1, 2, or 3, return true (can take all stones)
-
For each possible move (1, 2, or 3 stones), we:
- Make the move by subtracting stones
- Recursively check if opponent can win with remaining stones
- If opponent can't win, we win
Here's the implementation:
public boolean canWinNim(int n) {
if (n <= 0) return false;
if (n <= 3) return true;
// Try removing 1, 2, or 3 stones
return !(canWinNim(n-1) && canWinNim(n-2) && canWinNim(n-3));
}
Complexity Analysis
Pros and Cons
- Easy to understand and implement
- Directly simulates the game process
- Works for small inputs
- Extremely inefficient for large inputs
- Will cause stack overflow for large n
- Many redundant calculations
Code Solutions
Checking out 3 solutions in different languages for Nim Game. Click on different languages to view the code.
class Solution {
public
boolean canWinNim(int n) { return n % 4 != 0; }
}
Video Solution
Watch the video walkthrough for Nim Game
Similar Questions
5 related questions you might find useful
Patterns:
Subscribe to Scale Engineer newsletter
Learn about System Design, Software Engineering, and interview experiences every week.
No spam, unsubscribe at any time.