我们先来看思路和算法:
以下用 f(n,k) 表示 n 名小伙伴做游戏,每一轮离开圈子的小伙伴的计数为 k 时的获胜者编号。
当 n=1 时,圈子中只有一名小伙伴,该小伙伴即为获胜者,因此 f(1,k)=1。
当 n>1 时,将有一名小伙伴离开圈子,圈子中剩下 n−1 名小伙伴。圈子中的第 k' 名小伙伴离开圈子,k' 满足 1 ≤ k'≤ n 且 k - k' 是 n 的倍数。
由于 1≤k′≤n,因此 0≤k′−1≤n−1。又由于 k−k′ 是 n 的倍数等价于 (k-1)-(k'-1)是 n 的倍数,因此 k′−1=(k−1)modn,k′=(k−1)modn+1。
当圈子中剩下 n−1 名小伙伴时,可以递归地计算 f(n−1,k),得到剩下的 n−1 名小伙伴中的获胜者。令 x=f(n−1,k)。
由于在第 k' 名小伙伴离开圈子之后,圈子中剩下的 n−1 名小伙伴从第 k'+1名小伙伴开始计数,获胜者编号是从第 k'+1名小伙伴开始的第 x 名小伙伴,因此当圈子中有 n 名小伙伴时,获胜者编号是 f(n,k)=(k′modn+x−1)modn+1=(k+x−1)modn+1。
将 x=f(n−1,k) 代入上述关系,可得:f(n,k)=(k+f(n−1,k)−1)modn+1。
代码
Python3
class Solution:
def findTheWinner(self, n: int, k: int) -> int:
return 1 if n == 1 else (k + self.findTheWinner(n - 1, k) - 1) % n + 1
Java
class Solution {
public int findTheWinner(int n, int k) {
if (n == 1) {
return 1;
}
return (k + findTheWinner(n - 1, k) - 1) % n + 1;
}
}
C#
public class Solution {
public int FindTheWinner(int n, int k) {
if (n == 1) {
return 1;
}
return (k + FindTheWinner(n - 1, k) - 1) % n + 1;
}
}
好了,今天的文章分享就到这里了,希望对大家的学习有帮助哦!