文章目录

  • 题目
  • 解法一(暴力法)
  • 解法二(递归)
  • 解法三(循环)

题目

NO. 1579

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


解法一(暴力法)

思路:使用数组申请一块内存(也可以使用链表),按照要求循环执行n-1次移除操作,最后剩下的元素即为所求

  1. 申请一块连续内存,存放0到n的数值
  2. 位置索引按照题目要求计算,数组中索引从0开始,需要根据移动个数减一
  3. 最后一个数值即为所求
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
# author: suoxd123@126.com
class Solution:def lastRemaining(self, n: int, m: int) -> int:cnt, rmIdx = n, mcircle = [k for k in range(0,cnt)]for i in range(1,n):rmIdx = rmIdx%cnt - 1 #索引从0开始,计数从1开始tmpVal = circle.pop(rmIdx)cnt -= 1rmIdx = rmIdx + m if rmIdx >= 0 else m #索引为-1时,直接赋值mreturn circle.pop()

解法二(递归)

思路:约瑟夫环的公式为:f(n,m)=[f(n−1,m)+m]%nf(n,m) = [f(n-1,m)+m]\%nf(n,m)=[f(n−1,m)+m]%n,具体原理,我也没搞懂。
思路:约瑟夫环的递推公式为:f(n,m) = [f(n-1,m) + m] % n,具体原理,我也没搞懂,如果有明白的朋友,希望不吝赐教。

大概意思是,n-1个数值的最后剩余数值向右移动m位,即得到,n个数时最后剩余的数值(对n求余是,在超出数值时继续重0开始编号,为了形成环,这个我知道),具体原因,我也没理解。

看了一些解释,过程是,每次删除一个数后,从被删位置的下一个位置,从零开始重新循环编号。

  1. 当只有一个数据时,返回唯一的可能情况:0
  2. 递归得到上一次删除最后剩余的值 x
  3. 上一次的结果加入后,从x作为计数开始
  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
# author: suoxd123@126.com
class Solution:def lastRemaining(self, n: int, m: int) -> int:if n == 1:return 0x = self.lastRemaining(n-1,m)return (m + x) % n

解法三(循环)

思路:将递归的思路,使用循环实现

  • 时间复杂度:O(n)
  • 空间复杂度:O(1),另外也减少了栈空间的申请
# author: suoxd123@126.com
class Solution:def lastRemaining(self, n: int, m: int) -> int:last = 0for i in range(1,n):last = (last + m) % (i + 1)return last

3种方法: 圆圈中最后剩下的数字相关推荐

  1. 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)

    题目 0,1,2-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...

  2. [剑指offer]面试题45:圆圈中最后剩下的数字

    面试题45:圆圈中最后剩下的数字 题目:0,1,-,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. ❖ 经典的解法,用环形链表模拟圆圈 代 ...

  3. 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)

    剑指offer--面试题45:圆圈中最后剩下的数字(孩子们的游戏) Solution1: 当年第一遍做时,自己想的垃圾算法 class Solution { public:int LastRemain ...

  4. 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)

    剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...

  5. Q45:圆圈中最后剩下的数字

    备注:感觉这道题目的代码虽少,但理解起来还是有一定的难度,大家最好用纸和笔算算,仔细找一下映射前后函数的变化,是如何推导出递归式的. publicclass Q45圆圈中最后剩下的数字 {/*** 题 ...

  6. leetcode 面试题62. 圆圈中最后剩下的数字

    面试题62. 圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个 ...

  7. 【LeetCode】剑指 Offer 62. 圆圈中最后剩下的数字

    [LeetCode]剑指 Offer 62. 圆圈中最后剩下的数字 文章目录 [LeetCode]剑指 Offer 62. 圆圈中最后剩下的数字 一.动态规划 总结 一.动态规划 构建一个长度为 n ...

  8. 面试题62. 圆圈中最后剩下的数字

    面试题62. 圆圈中最后剩下的数字 思路:f(n,m) = (f(n-1,m)+m)%n.约瑟夫问题 写法1 class Solution { public:int lastRemaining(int ...

  9. LeetCode 面试题62. 圆圈中最后剩下的数字 详细题解

    面试题62. 圆圈中最后剩下的数字 难度 简单 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数 ...

  10. 46. 孩子们的游戏-圆圈中最后剩下的数字

    题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机 ...

最新文章

  1. zynq学习01 zynq 单独使用PL模块点亮led
  2. 这个ERP的冬天好冷啊!
  3. 知识图谱学习笔记-图操作
  4. PHPStorm的命令行配置成为Git bash的
  5. python cpu_python 让cpu满载
  6. 【译】《Pro ASP.NET MVC4 4th Edition》第三章(二)
  7. 理想回应800倍高阶收EPB驻车芯片:不属实
  8. jQuery Post
  9. Java代码如何运行在Java虚拟机中
  10. 协作中继认知无线电功率分配
  11. 红米6.0系统如何无root激活xposed框架的教程
  12. vue-$nextTick-等待页面渲染完毕的回调
  13. Linux C++ 信号量学习 sem_init sem_post sem_wait sem_timedwait
  14. 银行项目企业网银转账对私转账功能的测试点
  15. html-----简易版音乐播放器
  16. WebRTC::FEC
  17. JSF标签详解(全)
  18. Alphapose - Windows下Alphapose(Pytorch 1.1+)版本2021最新环境配置步骤以及踩坑说明
  19. Hadoop: Rack Awareness Topology
  20. 冷门项目玩法思路,小竞争大利润

热门文章

  1. MySql中的行锁和表锁的理解
  2. 软件测试的度量方法包括,软件测试过程的度量
  3. MTK处理器手机 解锁Bootloader 教程
  4. MTK芯片资料下载,MT6580处理器参数介绍
  5. watch监听的几个方法
  6. The Java™ Tutorials——(5)Essential Classes——Concurrency
  7. 椭圆积分函数和雅各比椭圆函数
  8. 微型计算机外文文献,单片机外文文献翻译---微型计算机控制系统
  9. Telsa K40m
  10. 2021年7月国产数据库排行榜:openGauss高歌猛进,GBase持续下跌