class Solution {
public:
int iceBreakingGame(int num, int target) {
int res = 0;
for(int i = 1; i < num; ){
i++;
res = (res + target) % i;
}
return res;
}
};
class Solution {
public int iceBreakingGame(int num, int target) {
if( num == 0) return num;
//return (lastRemaining(n - 1, m) + m) % n;
// 优化
int res = 0;
for(int i = 1; i <= num; i++){
res = (res + target) % i;
}
return res;
}
}
class Solution {
public int lastRemaining(int n, int m) {
int ans = 0;
//最后一轮剩下2个人, 所有从2开始反推
for(int i = 2; i <= n; i++){
ans = (ans + m) % i;
}
return ans;
}
}
//递归
class Solution {
public int lastRemaining(int n, int m) {
if(n == 1) return 0;
return (lastRemaining(n - 1, m) + m) % n;
}
}
//迭代
class Solution {
public int lastRemaining(int n, int m) {
int x = 0; //最终剩余的数的初始位置一定是0,反推其最开始的位置
for (int i = 2; i <= n; i++) {
x = (x + m) % i; //递推公式f(n, m) = [f(n−1, m) + m] % n
}
return x;
}
}
共以下 8 个回答
模拟会超时
8.10 周四
Day31:下面是代码
class Solution {
public int lastRemaining(int n, int m) {
// 从左往右选 到m个 最后吧m+1放首位 不就是把m+1往左移m个到头吗
//所以 从下轮回到最开始 不就是补回被删的m 再右移回去
//f(n)=(f(n-1)+m)%n
int dp[]=new int[n+1];
dp[0]=0;
if(n1) return 0; //从0开始 最后一定为0
for(int i=2;i<=n;i++)
{
dp[i]=(dp[i-1]+m)%i;
}
return dp[n];
}
}
约瑟夫环