题目
0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里面删除第m个数字。求出这个圆圈里剩下的最后一个数字。
解题思路
思路1:环形链表模拟圆圈
- 本题就是有名的约瑟夫环问题。既然题目有一个数字圆圈,很自然的想法是我们用一个数据结构来模拟这个圆圈。在常用的数据结构中,我们很容易想到用环形链表。我们可以创建一个共有n个节点的环形链表,然后每次从这个链表中删除第m个节点。
- 但是重新思考,觉得使用链表还是太过于复杂,因此使用了一个vector来模拟环形链表,当符合计数条件时,直接移除这个数据,最后vector大小为1的时候,就是找到了最后一个数字。
思路2:推导递推公式
结论:从n个数字中每隔m个数字删除一个数字,递推公式为 f(n,m) = [f(n-1, m) + m]%n
代码
思路1:
class Solution{
public:
//n个数字,每次删除第m个数字
int LastRemaining_Solution(int n, int m){
if (n < 1 ||