约瑟夫环是算法里面非常重要的一个问题,今天分享两种非常巧妙的解法
题目来源
解题方法
递归
关键点:第m个人被杀后以第m+1个人为数组头开始找下一个人,那么实际上就是将数组左移m位
class Solution {
public:
int lastRemaining(int n, int m) {
return helper(n,m);
}
int helper(int n, int m){
if(n==1)
return 0;
return (helper(n-1,m)+m) % n;
}
};
迭代
class Solution {
public:
int lastRemaining(int n, int m) {
int pos=0;//最终活下来的人的下标
for(int i=2;i<=n;i++){
pos=(pos+m)%i;
}
return pos;
}
};
最后附上一篇给了我启发的文章,感觉约瑟夫环的问题掌握这个思想就特别简单了
约瑟夫环——公式法(递推公式)