数组模拟
这里特别要注意一下,删除某处迭代器的值后会返回下一个迭代器,此时也要判断是否到达边界
class Solution {
public:
int lastRemaining(int n, int m){
vector<int> res;
for (int i = 0; i < n; i ++ ) res.push_back(i);
auto it = res.begin();
int k = n - 1;
while (k -- ) {
for (int i = 0; i < m - 1; i ++ ) {
it ++;
if (it == res.end()) it = res.begin();
}
it = res.erase(it);
if (it == res.end()) it = res.begin();
}
return *it;
}
};
递推
f(n, m)
表示的是n个数里每次干掉第m个数,最后数的编号,f(n - 1, m)
表示第一轮已经干掉了第m个数,剩下的n - 1
个数每次干掉第m个数,最后数的编号,最后的这个数肯定是同一个数,只不过被重新编号了,因此要处理一下新编号到旧编号的映射
class Solution {
public:
int lastRemaining(int n, int m){
if (n == 1) return 0;
return (lastRemaining(n - 1, m) + m) % n;
}
};