剑指Offer 62 - 圆圈中最后剩下的数字

力扣链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/

题目描述

0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

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

思路:动态规划

  • 无论以哪个数为起点,只要总数n和间隔数m确定,最终剩下的数与起点之间的相对距离是一定的
  • 要求的f(n, m)是以位置0为起点,总数n,间隔m的结果
  • 第一个被删掉的数一定是第m%n个(索引m%n-1),也就是说下一个起点的索引是m%n。
  • f(n-1, m)是以位置0为起点,总数n-1,间隔m的结果。也是总数n-1,间隔m时,剩下的数与起点的相对距离。

由以上可得:f(n,m) = ( m%n + f(n-1, m) ) % n = (m + f(n-1, m)) % n 。特别地,当n为1时,f(1, m) = 0

完整的递推公式:

f(n, m) = 1 , (n = 1)

f(n, m) = (m + f(n-1, m)) % n , n > 1

代码:

/**
 * @param {number} n
 * @param {number} m
 * @return {number}
 */
var lastRemaining = function(n, m) {
    //f(1,m)
    let res = 0;
    
    //f(2,m) - f(n,m)
    for(let i = 2; i <= n; i++){
        // res = (m%i + res) % i;
        res = (m + res) % i;
    }
    
    return res;
};

时间复杂度: O(N)

空间复杂度:O(1)

 

posted @ 2020-07-19 23:34  studystudyxinxin  阅读(121)  评论(0编辑  收藏  举报