思路
这是经典的约瑟夫环问题。
方法一:用链表模拟
用链表模拟整个游戏过程。如果单纯用链表模拟的话,每次需要从1数到m,才能踢除1个数,所以踢除n-1个数一共需要遍历(n-1)*m次,时间复杂度就是O(n*m),这种方法会超时。
方法二:数学递推公式
1 class Solution { 2 public: 3 int lastRemaining(int n, int m) { 4 int f = 0; 5 for(int i = 2; i <= n; ++i) { 6 f = (f + m) % i; 7 } 8 9 return f; 10 } 11 };