编号为 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
}
}
注意:
- K神是真的很厉害
- 记住状态转移公式dp[i] = (dp[i-1]+m)%i
- 力扣中编号从0开始,牛客中编号从1开始,注意最后结果+1
该博客探讨了一个经典的算法问题,即n个人围成一圈按顺序报数,报到m的人离开,以此类推,直至只剩一人。博主详细讲解了如何利用状态转移公式dp[i] = (dp[i-1] + m) % i来解决此问题,并提供了Java实现,特别强调了在不同平台中编号的起始差异。文中提到的空间复杂度为O(1),时间复杂度为O(n)。
3211

被折叠的 条评论
为什么被折叠?



