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:
- Start at the
1st
friend. - Count the next
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. - The last friend you counted leaves the circle and loses the game.
- If there is still more than one friend in the circle, go back to step
2
starting from the friend immediately clockwise of the friend who just lost and repeat. - Else, the last friend in the circle wins the game.
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
Related Topics:
Array
// OJ: https://leetcode.com/problems/find-the-winner-of-the-circular-game/
// Author: github.com/lzl124631x
// Time: O(NK)
// Space: O(N)
class Solution {
public:
int findTheWinner(int n, int k) {
set<int> s;
for (int i = 1; i <= n; ++i) {
s.insert(i);
}
auto it = begin(s);
while (s.size() > 1) {
for (int i = 1; i < k; ++i) {
it = it == prev(s.end()) ? begin(s) : next(it);
}
auto j = it == prev(s.end()) ? begin(s) : next(it);
s.erase(it);
it = j;
}
return *s.begin();
}
};
Let f(n,k)
be the 0-based index of the winning person.
Assume we have n
persons with indexes 0 ~ (n-1)
, the person got kicked out (say Alice) has index (k - 1) % n
, and the next person (say Bob) of this kicked-out person has index k % n
.
In the next turn, there are n - 1
persons, and we start the game from Bob. If Bob has index 0
, the winning person will have index f(n-1,k)
.