class Solution {
public int iceBreakingGame(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 iceBreakingGame(int num, int target) {
int res = 0;
for(int i = 2; i <= num; i++) {
res = (res + target) % i;
}
return res;
}
};
共以下 4 个回答
解题思路
– dp[n] 和 dp[n-1]的关系是什么?dp[n] 表示的是i个数据,dp[n-1]表示的i-1个数据
– 那么只需要dp[n]先把第一轮要去除的数据去除掉,去除后的规模就和dp[n-1]保持一致了
– 去除的点index= (m-1)%n,dp[n-1]’的起点是index= m % n。注意dp[n]=dp[n-1]‘
– 如果我们把dp[n-1]’的起点index= m % n视同是0,dp[n-1]‘=( m%n + dp[n-1] ) ,因为可能越界,dp[n-1]‘=( m%n + dp[n-1] ) % n=dp[n]
【题解1】
时间复杂度O(N),空间复杂度O(1)。