思路1:用数学归纳法推导出递推公式,设有n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数。令f[i]表示i个人时最后胜利者的编号,则有递推公式:
    f[1]=0;
    f[i]=(f[i-1]+m)%i; (i>1)
    https://blog.csdn.net/crazy__chen/article/details/45115911
    AD29A901-CC96-4916-B0D6-D3C6DB2ECC2E.jpeg

    1. //递归法
    2. int LastRemaining_Solution(int n, int m){
    3. if (n <= 0 || m <= 0) return -1;
    4. return n == 1 ? 0 : (LastRemaining_Solution(n - 1, m) + m) % n;
    5. }
    6. //非递归法
    7. int LastRemaining_Solution(int n, int m)
    8. {
    9. if (n <= 0 || m <= 0) {
    10. return -1;
    11. }
    12. int ans = 0;
    13. for (int i = 2; i <= n; i++) {
    14. ans = (ans + m) % i;//注意此处是i
    15. }
    16. return ans;
    17. }

    时间:O(N)
    思路2:环形链表模拟