leetcode递归(LCR 187. 破冰游戏)

前言

经过前期的基础训练以及部分实战练习,粗略掌握了各种题型的解题思路。现阶段开始专项练习。递归大部分题解可以使用迭代方式求解,使用递归是为了熟悉递归的解题思路。

描述

社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。

示例 1:

输入:num = 7, target = 4
输出:1

示例 2:

输入:num = 12, target = 5
输出:0

提示:

  • 1 <= num <= 10^5
  • 1 <= target <= 10^6

实现原理与步骤

“破冰游戏”就是个约瑟夫斯问题。约瑟夫斯问题是这样描述的:一组人围成一个圈,按照固定的规则(通常是每隔 k 个就移除一个人),直到只剩下最后一个人为止。

数学解法

约瑟夫斯问题可以通过递归来解决,也可以通过数学推导得出一个非递归的解法。

  • 递归公式

    • f(n, k) 为 n 个人中每隔 k 个数移除一个人后,最后剩下的人的编号(从 0 开始编号)。
    • 递归关系为: f(n,k)=(f(n−1,k)+k)%n
    • 初始条件:当只有一个人时,f(1, k) = 0

 实现代码

class Solution {
    public int iceBreakingGame(int num, int target) {
        return josephus(num, target);
    }

    // 递归方法求解约瑟夫斯问题
    public int josephus(int n, int k) {
        if (n == 1) {
            return 0; // 只有一个人时,编号为 0
        } else {
            return (josephus(n - 1, k) + k) % n;
        }
    }
}

1.QA:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值