(C++)剑指offer-46:圆圈中最后剩下的数
约瑟夫问题,n个人的编号为0~n-1,对删除的过程进行分析。假设m小于n,第一个删除的数字即为m-1,对应新的数编号为0,1,…;而上述旧编号为m,m+1,…;通过分析可以发现f(n,m) = f(n-1,m) + m;当然上述分析是m<n的情况,当m>n时,需要取模,因此递归通用公式为f(n,m) = (f(n-1,m) + m)%n;时间复杂度为O(n),具体代码如下:
class Solution {
public:
int LastRemaining_Solution(int n, int m)
{
if(n == 0) return -1; //边界
if(n == 1) return 0;
return (LastRemaining_Solution(n-1,m)+m)%n;
}
};