Loading

剑指 Offer 62. 圆圈中最后剩下的数字

 

 

思路

这是经典的约瑟夫环问题。

方法一:用链表模拟

用链表模拟整个游戏过程。如果单纯用链表模拟的话,每次需要从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 };

 

参考

换个角度举例解决约瑟夫环

posted @ 2020-11-15 12:35  拾月凄辰  阅读(58)  评论(0编辑  收藏  举报