剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode)
总共n个数字,最后剩下一个数字,所以要进行n-1次删除。
用数组来模拟,进行倒推,假设活下来的人为 v:
- 当只剩下 v 的时候,数组只有一个元素,v下标只能是0
- 当剩下两个人(x和v,X不用管是谁,反正V在两个人里面)的时候,此时这两个人的下标有两种可能:x = 0, v = 1或者x = 1, v = 0,但是只有一种可能是v活下去的,这种可能中v的下标应该为:(0+m)%2。假设m = 3,那么v的下标必须为1才能活下去。
。。。还是看大佬的题解吧:Java解决约瑟夫环问题,告诉你为什么模拟会超时! - 圆圈中最后剩下的数字 - 力扣(LeetCode)
class Solution {
public:
int lastRemaining(int n, int m) {
int res = 0;//只剩下一个人的时候,下标必然为0
// 最后一轮剩下2个人,所以从2开始反推
for(int i = 2; i <= n; ++i){
res = (res+m)%i;
}
return res;
}
};
并不容易理解,还是建议自己画图看看。