个人理解

孩子们的游戏(圆圈中最后剩下的数)

http://www.nowcoder.com/questionTerminal/f78a359491e64a50bce2d89cff857eb6

第一次有人出圈,剩下的人组成新环,相当于前移了m位,设在旧环中喊号的次序为old_order

在新环喊号的次序为new_order = (old_order - m + old_num ) % old_number

递推有 old_order % old_num = (new_order + m) % old_num

又,0 <= old_order < old_num

得,old_order = (new_order + m) % old_num

同时,可以得出以下关系:

sum-1环的第一次出环 对应 sum环的第二次出环

又由新旧环次序对应关系得

f(sum)表示sum环的最后剩下数字编号

f(sum-1)表示sum环经过一次出环,sum-1环的最后剩下数字编号

他们是同一个人,只是要经过新旧环次序关系转换,从旧到新转换,就是一次出环

实例,n=9,m=4

起始号:0 1 2 3 4 5 6 7 8

初始环:0 1 2 3 4 5 6 7 8

新次序:5 6 7 0 1 2 3 4

旧环的第2次出环是起始号7,旧次序7

新环的第1次出环是起始号7,新次序3

class Solution {
public:
    int func(int n, int m) {
        if ( 1 == n ) {
            return 0;
        }
        return (func(n-1, m) + m) % n;
    }
    int LastRemaining_Solution(int n, int m) {
        if ( 0 == n || 1 > m ) {
            return -1;
        }
        return func(n,m);
    }
};
全部评论

相关推荐

看起来名字可以很长:笑死 我暑期实习阿里云的意向也被 qq 邮箱放在垃圾箱了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务