约瑟夫环

18 篇文章 0 订阅

题目:
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

来源:力扣(LeetCode)

思路:
么当我们删除一个数字,就将整个数组中的所有数字向前挪动m位,这样我们每次删除一个数字时都是从数组中第一个元素算起,而当我们删除到最后的时候,整个数组便只剩下一个元素。
而我们的思路便将上诉过程的逆过来思考。

我们知道,如果当数组只剩下x个元素且我们最终存活的元素下标是p,那么在元素个数为x+1时,p = (p+m)%(x+1)。

由于我们知道数组元素为1,且最终存活下标为0。我们便可以逆推到元素个数为n时,最终存活元素的下标。

整个过程有点类似递归,我们先拿到的是最终结果。

class Solution {
    public int lastRemaining(int n, int m) {
        if(n == 1)
            return 0;
        int res = 0;
        for(int i = 2;i<=n;i++){
            res = (res+m)%i;
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值