约瑟夫环(递归+迭代)

文章探讨了如何使用递归和迭代方法解决LeetCode上的约瑟夫环问题(JosephusProblem)。通过模拟过程,作者指出关键在于确定在不同人数(n)下的幸存者位置。递归方案从较大规模问题出发,而迭代方案从基本情况开始构建。两种方法都避免了栈溢出,且迭代解法被认为更高效。
摘要由CSDN通过智能技术生成

剑指 Offer 62. 圆圈中最后剩下的数字

leetcode

这题让我对递归和迭代又有了新的一层认识,首先一定要把图画对,就是模拟约瑟夫的这个过程
红色是被淘汰的位置,绿色的3是最后会活下来的人的位置
0 ~ n 正好是数组中的下标
重点在于计算 不同n时 幸存位置的下标,这里n = 5 去模拟淘汰的过程,2被淘汰,3就变成新的0号位置,循环下去模拟直到最后活下来的只有一个人就是3
n是固定的 那活下来的人也是固定的
本质就是我知道 n -1 = 4 时 队列情况是 3 4 0 1 时 3 的位置是0
(0 + 3)% 5 就可以得出 n = 5时 存活位置的下标 = 3
循环和递归就是 起点不同,分别是是开头(最下面)和结尾(最上面)

在这里插入图片描述

递归是从上往下,要知道当前f(n,m)的值, 需要知道 f(n-1,m)的值
那就出来了,求n 按照这个规律递归去求n-1
结束条件就是 n == 1 就是 0位置幸存

 int lastRemaining(int n, int m) {

        //递归  从上往下
         if(n == 1)
             return 0;
         return (lastRemaining(n-1,m)+m)%(n);

    }

循环是从下往上,只有一个人幸存位置就是0,那么从2个人开始,也就是n =2
这个好像更简单高效,毕竟循环不会栈溢出
根据画图和规律就是 : pos = (pos + m) % i; // %取余控制pos不会越界而是在范围里走
在这里插入图片描述

int lastRemaining(int n, int m) {

        //递归  从上往下
        // if(n == 1)
        //     return 0;
        // return (lastRemaining(n-1,m)+m)%(n);

        //非递归 从下往上
        int pos = 0;
        for(int i = 2; i <= n; i++)
        {
            pos = (pos + m) % i; // %取余控制pos不会越界而是在范围里走
        }
        return pos;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值