约瑟夫环(超好的代码存档)--19--约瑟夫环--LeetCode面试题62(圆圈最后剩下的数字)

圆圈中最后剩下的数字

    0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
  例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

示例 1:
输入: n = 5, m = 3
输出: 3

示例 2:
输入: n = 10, m = 17
输出: 2

限制:
    1 <= n <= 10^5
    1 <= m <= 10^6

 1 class Solution {
 2     public int lastRemaining(int n, int m) {
 3         if (n == 1)
 4             return 0;
 5         int now = lastRemaining(n - 1, m);
 6         return (m % n + now) % n;
 7     }
 8     /*                                                                     淘汰顺序
 9         n = 1:一个元素:0                                                    0           最后一次淘汰的下标是0 
10         n = 2:两个元素:0 1            3 % 2 + 0 == 1         1 % 2 == 1     0 1         最后一次淘汰的下标是1 
11         n = 3:三个元素:0 1 2          3 % 3 + 1 == 1         1 % 3 == 1     2 0 1       最后一次淘汰的下标是1
12         n = 4:四个元素:0 1 2 3        3 % 4 + 1 == 4         4 % 4 == 0     2 1 3 0     最后一次淘汰的下标是0
13         n = 5:五个元素:0 1 2 3 4      3 % 5 + 0 == 3         3 % 5 == 3     2 0 4 1 3   最后一次淘汰的下标是3
14     */
15 }

 

posted @ 2020-05-24 17:53  我只是一个码农  阅读(161)  评论(0编辑  收藏  举报