Problem Statement
Brute Force - Accepted
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
queue = deque([i for i in range(1, n + 1)])
node = 0
while queue:
for _ in range(k - 1):
queue.append(queue.popleft())
node = queue.popleft()
return node
Editorial
Approach 1: Simulation with List
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
# Initialize list of N friends, labeled from 1-N
circle = list(range(1, n + 1))
# Maintain the index of the friend to start the count on
start_index = 0
# Perform eliminations while there is more than 1 friend left
while len(circle) > 1:
# Calculate the index of the friend to be removed
removal_index = (start_index + k - 1) % len(circle)
# Remove the friend at removal_index
circle.pop(removal_index)
# Update the start_index for the next round
start_index = removal_index
return circle[0]
Approach 2: Simulation with Queue
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
# Initialize deque with n friends
circle = deque(range(1, n + 1))
# Perform eliminations while more than 1 player remains
while len(circle) > 1:
# Process the first k-1 friends without eliminating them
for _ in range(k - 1):
circle.append(circle.popleft())
# Eliminate the k-th friend
circle.popleft()
return circle[0]
Approach 3: Recursion
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
return self.winnerHelper(n, k) + 1
def winnerHelper(self, n: int, k: int) -> int:
if n == 1:
return 0
return (self.winnerHelper(n - 1, k) + k) % n
Approach 4: Iterative
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
ans = 0
for i in range(2, n + 1):
ans = (ans + k) % i
# add 1 to convert back to 1 indexing
return ans + 1