3种方法: 圆圈中最后剩下的数字
文章目录
- 题目
- 解法一(暴力法)
- 解法二(递归)
- 解法三(循环)
题目
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次移除操作,最后剩下的元素即为所求
- 申请一块连续内存,存放0到n的数值
- 位置索引按照题目要求计算,数组中索引从0开始,需要根据移动个数减一
- 最后一个数值即为所求
- 时间复杂度: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开始编号,为了形成环,这个我知道),具体原因,我也没理解。
看了一些解释,过程是,每次删除一个数后,从被删位置的下一个位置,从零开始重新循环编号。
- 当只有一个数据时,返回唯一的可能情况:0
- 递归得到上一次删除最后剩余的值 x
- 上一次的结果加入后,从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种方法: 圆圈中最后剩下的数字相关推荐
- 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)
题目 0,1,2-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...
- [剑指offer]面试题45:圆圈中最后剩下的数字
面试题45:圆圈中最后剩下的数字 题目:0,1,-,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. ❖ 经典的解法,用环形链表模拟圆圈 代 ...
- 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)
剑指offer--面试题45:圆圈中最后剩下的数字(孩子们的游戏) Solution1: 当年第一遍做时,自己想的垃圾算法 class Solution { public:int LastRemain ...
- 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)
剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...
- Q45:圆圈中最后剩下的数字
备注:感觉这道题目的代码虽少,但理解起来还是有一定的难度,大家最好用纸和笔算算,仔细找一下映射前后函数的变化,是如何推导出递归式的. publicclass Q45圆圈中最后剩下的数字 {/*** 题 ...
- leetcode 面试题62. 圆圈中最后剩下的数字
面试题62. 圆圈中最后剩下的数字 0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个 ...
- 【LeetCode】剑指 Offer 62. 圆圈中最后剩下的数字
[LeetCode]剑指 Offer 62. 圆圈中最后剩下的数字 文章目录 [LeetCode]剑指 Offer 62. 圆圈中最后剩下的数字 一.动态规划 总结 一.动态规划 构建一个长度为 n ...
- 面试题62. 圆圈中最后剩下的数字
面试题62. 圆圈中最后剩下的数字 思路:f(n,m) = (f(n-1,m)+m)%n.约瑟夫问题 写法1 class Solution { public:int lastRemaining(int ...
- LeetCode 面试题62. 圆圈中最后剩下的数字 详细题解
面试题62. 圆圈中最后剩下的数字 难度 简单 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数 ...
- 46. 孩子们的游戏-圆圈中最后剩下的数字
题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机 ...
最新文章
- zynq学习01 zynq 单独使用PL模块点亮led
- 这个ERP的冬天好冷啊!
- 知识图谱学习笔记-图操作
- PHPStorm的命令行配置成为Git bash的
- python cpu_python 让cpu满载
- 【译】《Pro ASP.NET MVC4 4th Edition》第三章(二)
- 理想回应800倍高阶收EPB驻车芯片:不属实
- jQuery Post
- Java代码如何运行在Java虚拟机中
- 协作中继认知无线电功率分配
- 红米6.0系统如何无root激活xposed框架的教程
- vue-$nextTick-等待页面渲染完毕的回调
- Linux C++ 信号量学习 sem_init sem_post sem_wait sem_timedwait
- 银行项目企业网银转账对私转账功能的测试点
- html-----简易版音乐播放器
- WebRTC::FEC
- JSF标签详解(全)
- Alphapose - Windows下Alphapose(Pytorch 1.1+)版本2021最新环境配置步骤以及踩坑说明
- Hadoop: Rack Awareness Topology
- 冷门项目玩法思路,小竞争大利润