首页 > 其他 > 详细

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

时间:2020-07-20 00:48:26      阅读:73      评论:0      收藏:0      [点我收藏+]

力扣链接: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)

 

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

原文:https://www.cnblogs.com/xintangchn/p/13342057.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!