剑指offer---圆圈中最后剩下的数
题目:圆圈中最后剩下的数
要求:0,1,2...n-1 共n个数排成一个圆圈,从数字0开始,每次删除第m个元素,求这个圆圈里面剩下的最后一个元素
如 n=5, m=3 的情况:0, 1, 2, 3, 4 组成一个圆圈,删除第三个元素 2,剩余元素为 0, 1, 3, 4,注意下次再删除元素时需要从上次删除元素的下一个元素开始计算,现在继续删除第三个元素,即删除0 ,这样依次进行下去,。。。删除4,。。。删除1,直到圈内只剩下一个元素,返回该元素。
【参见约瑟夫环问题】
class Solution { public: int LastRemaining_Solution(int n, int m) { } };
解题代码:
class Solution { public: int LastRemaining_Solution(int n, int m) { if(n < 1 || m < 1) return -1; list<int> numbers; for(int i = 0; i < n; i++) numbers.push_back(i); /** * 注意: * begin()指向首元素地址 * end()指向最后一个元素的下一个地址 */ list<int>::iterator current = numbers.begin(); while(numbers.size() > 1){ for(int i=1; i < m; i++){ current++; if(current == numbers.end()) current = numbers.begin(); } // 这里注意更新完next指针的时候,不要忘记将current指向原位置 list<int>::iterator next = ++current; current--; if(next == numbers.end()) next = numbers.begin(); numbers.erase(current); current = next; } return *(numbers.begin()); } };