问题:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
思路1:环形链表模拟圆圈
复杂度分析:时间复杂度为O(mn),空间复杂度为O(n).
思路2:分析每次被删除的数字的规律并直接计算出圆圈中最后剩下的数字
定义f(n,m)为从0到n-1中删除第m个数字,循环到最后只剩下的1个数字。
递归代码:
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n<1)
return -1;
if(n==1)
return 0;
int res;
res=(LastRemaining_Solution(n-1,m)+m)%n;
return res;
}
};
复杂度分析:时间复杂度为O(n),空间复杂度为O(1).