题目描述
0,1,…,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字
思路
考虑用环形链表解决;用stl中的list来模拟环形链表
注意:
list本身不是环形结构,所以每当迭代器扫描到链表末尾时,需要把迭代器移到链表的头部
list的erase方法删除节点后,原来的迭代器会失效,所以需要保存下一个节点
代码
class Solution {
public:
// 环形链表
// STL中的list只有没有循坏,每次访问到链表末尾时要重新指向链表头
int LastRemaining_Solution(int n, int m){
if (n<1 || m<1)
return 0;
list<int> nums;
for (int i = 0; i < n; ++i) {
nums.push_back(i);
}
list<int>::iterator cur = nums.begin();
while (nums.size()>1){
for (int i = 1; i < m; ++i) {
cur++;
if(cur == nums.end())
cur = nums.begin();
}
list<int>::iterator next = ++cur; // 保存下一个节点
if (next == nums.end())
next = nums.begin();
cur--;
nums.erase(cur); // 删除该节点
cur = next; // 指向下一个节点
}
return *(cur);
}
};
思路2 递归公式
// 递归公式求解
class Solution {
public:
int LastRemaining_Solution(int n, int m){
if(n<1||m<1)
return -1;
int last = 0;
for (int i = 2; i<=n; ++i){
last = (last+ m) % i;
}
return last;
}
};