​题目传送门​


剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_迭代


题解

  • 解法一:暴力剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_迭代_02
  • 解法二:递归
    剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_03表示题意所求。则首先明确剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_自底向上_04(一个人肯定就是自己了)
    采用自底向上的方式,设剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_自底向上_05
    当前长度为剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_迭代_06,那么本次会删除剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_自底向上_07的位置,变成长度为剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_08
    而我们已经知道了,长度为剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_08的时候,最后一名所在位置是剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_10
    所以剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_11
  • 解法三:迭代
    由解法二可知,递归可以转变为迭代求解。
  • 最终:时间复杂度剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_递归_12,空间复杂度剑指Offer——JZ46.孩子们的游戏(圆圈中最后剩下的数)【递归 | 迭代】_迭代_13

AC-Code

class Solution {
public:
int LastRemaining_Solution(int n, int m) {
if(n <= 0) return -1;
int x = 0;
for(int i = 2; i <= n; ++i) {
x = (x + m) % i;
}
return x;
}
int dfs(int n, int m) {
if(n == 1) return 0;
int x = dfs(n - 1, m);
return (x + m) % n;
}
};