剑指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());
    }
};
原文地址:https://www.cnblogs.com/iwangzhengchao/p/9960061.html