数学 + 递归方法解算法题分享

我们先来看思路和算法:

以下用 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;
    }
}

好了,今天的文章分享就到这里了,希望对大家的学习有帮助哦! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值