面试题62:圆圈中最后剩下的数字

本文探讨了经典的约瑟夫环问题,即圆圈中最后剩下的数字问题。通过递推公式和动态规划策略,我们可以找到解决这类问题的方法。给定一个圆圈中的初始数字序列和每次删除的数字位置,程序可以计算出最终剩余的数字。题目提供了LeetCode上的解决方案,该算法以O(n)的时间复杂度找到答案。
摘要由CSDN通过智能技术生成

面试题62:圆圈中最后剩下的数字

题目

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

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

考点

“约瑟夫环问题”

记0,1,…,n-1,删除第m个数字为f(n,m),删除的数字为(m-1)%n,删除后下一个数字为m%n, 记为t

f(n,m)的数字环为

0,1,…,n-1

f(n-1,m)的数字环为

0,1,…,n-2

删除第m个数字后的排列为:

t,t+1,t+2,…,0,1,2,…,t-3,t-2 即为f(n-1,m)的排列

因此f(n-1,m)中某一位置x,在f(n,m)的位置为 (x+t)%n,即(x+m%n)%n

即(x+m)%n

f(1,m)的位置为0

综上可得以下代码

LeetCode版本

class Solution {
public:
    int lastRemaining(int n, int m) {
        int res =0;
        for(int i = 2; i<=n; i++){
            res = (res+m)%i;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值