约瑟夫环问题(圆圈中最后剩下的人)

该博客探讨了一个经典的算法问题,即n个人围成一圈按顺序报数,报到m的人离开,以此类推,直至只剩一人。博主详细讲解了如何利用状态转移公式dp[i] = (dp[i-1] + m) % i来解决此问题,并提供了Java实现,特别强调了在不同平台中编号的起始差异。文中提到的空间复杂度为O(1),时间复杂度为O(n)。

编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。

下一个人继续从 1 开始报数。

n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?

数据范围: 1≤n,m≤1000

进阶:空间复杂度 O(1),时间复杂度 O(n)

java:

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 
     * @param m int整型 
     * @return int整型
     */
    public int ysf (int n, int m) {
        // write code here
        int dp = 0;  //先按照索引号进行报数      
        
        for(int i = 2; i<=n; i++){
            dp = (dp+m)%i;            
        }
        return dp+1; //索引号对应的值为索引号+1
    }
}

注意:

  1. K神是真的很厉害
  2. 记住状态转移公式dp[i] = (dp[i-1]+m)%i
  3. 力扣中编号从0开始,牛客中编号从1开始,注意最后结果+1
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值