There are n
friends that are playing a game. The friends are sitting in a circle and are numbered from 1
to n
in clockwise order. More formally, moving clockwise from the ith
friend brings you to the (i+1)th
friend for 1 <= i < n
, and moving clockwise from the nth
friend brings you to the 1st
friend.
The rules of the game are as follows:
1st
friend.k
friends in the clockwise direction including the friend you started at. The counting wraps around the circle and may count some friends more than once.2
starting from the friend immediately clockwise of the friend who just lost and repeat.Given the number of friends, n
, and an integer k
, return the winner of the game.
Example 1:
Input: n = 5, k = 2 Output: 3 Explanation: Here are the steps of the game: 1) Start at friend 1. 2) Count 2 friends clockwise, which are friends 1 and 2. 3) Friend 2 leaves the circle. Next start is friend 3. 4) Count 2 friends clockwise, which are friends 3 and 4. 5) Friend 4 leaves the circle. Next start is friend 5. 6) Count 2 friends clockwise, which are friends 5 and 1. 7) Friend 1 leaves the circle. Next start is friend 3. 8) Count 2 friends clockwise, which are friends 3 and 5. 9) Friend 5 leaves the circle. Only friend 3 is left, so they are the winner.
Example 2:
Input: n = 6, k = 5 Output: 1 Explanation: The friends leave in this order: 5, 4, 6, 2, 3. The winner is friend 1.
Constraints:
1 <= k <= n <= 500
Follow up:
Could you solve this problem in linear time with constant space?
The problem describes a circular game where players are eliminated one by one until only one remains. The goal is to find the winner given the number of players (n
) and the count (k
) before elimination.
This approach uses recursion to simulate the game. The base case is when there's only one player left (n == 1
), who is the winner. Otherwise, the function recursively calls itself with one fewer player (n - 1
) and calculates the winner's position. The modulo operator (%
) handles the circularity of the game.
Time Complexity: O(n). The recursion depth is n
, and each recursive call performs constant-time operations.
Space Complexity: O(n) due to the recursive call stack.
Code (Python):
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
if n == 1:
return 1
ans = (k + self.findTheWinner(n - 1, k)) % n
return n if ans == 0 else ans
This approach simulates the game using a loop and an array to represent the players. The loop continues until only one player remains. The splice
method removes the eliminated player, and the modulo operator ensures the circular nature of the game.
Time Complexity: O(n^2) in the worst case. The outer loop iterates n-1
times. In each iteration, splice
operation can take O(n) time in the worst case if the element to remove is at the beginning of the array. Therefore, the worst-case time complexity is approximately O(n^2). In average cases where the elements are spread out the time complexity will be close to O(n).
Space Complexity: O(n) to store the array of players.
Code (Typescript):
function findTheWinner(n: number, k: number): number {
const arr = Array.from({ length: n }, (_, i) => i + 1);
let i = 0;
while (arr.length > 1) {
i = (i + k - 1) % arr.length;
arr.splice(i, 1);
}
return arr[0];
}
Note: The recursive solution (Approach 1) is generally preferred because of its better time complexity (linear) compared to the iterative approach (quadratic in the worst case). However, the iterative approach might be easier to understand for some. The provided code examples demonstrate both approaches in multiple programming languages.