(圆圈中最后剩下的数字)约瑟夫问题
0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。
求出这个圆圈里剩下的最后一个数字。
方法一 (暴力模拟)
#include <list>
class Solution {
public:
int lastRemaining(int n, int m){
list<int> nums;
for (int i = 0; i < n; ++i) nums.push_back(i);
auto it = nums.begin();
int k = m - 1;
while (nums.size() > 1){
while (k--){
it++;
if (it == nums.end()) it = nums.begin();//别迭代器移到开头实现模拟环形列表
}
it = nums.erase(it);//删除第m个元素
if (it == nums.end()) it = nums.begin();
k = m - 1;
}
return nums.front();
}
};
方法二 递推
class Solution {
public:
int lastRemaining(int n, int m){
if(n==1) return 0;
else return (lastRemaining(n-1,m)+m)%n;
}
};