23. 圆圈中最后剩下的数字
一、题目
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
二、实现
方法一:链表 O(n^2)
可以分析下纯暴力的做法,每次找到删除的那个数字,需要 O(m)的时间复杂度,然后删除了 n-1次。但实际上我们可以直接找到下一个要删除的位置的!
假设当前删除的位置是 idx,下一个删除的数字的位置是 idx +m 。但是,由于把当前位置的数字删除了,后面的数字会前移一位,所以实际的下一个位置是 idx +m−1。由于数到末尾会从头继续数,所以最后取模一下,就是 (idx + m - 1) mod n。
class Solution {public int lastRemaining(int n, int m) {ArrayList<Integer> list = new ArrayList<>(n);for(int i=0;i<n;i++){list.add(i);}int curm = 0; //记录要删除数字的下标(从0开始)while(n>1){// 删除第m个数字curm = (curm+m-1)%n;list.remove(curm);// 删除后的长度n--;}return list.get(0);}
}
方法二:数学方法(O(n))
class Solution {public int lastRemaining(int n, int m) {int ans = 0;// 最后一轮只剩2个人。因此从2开始反推for(int i=2;i<=n;i++){ans = (ans+m) % i;}return ans;}
}
23. 圆圈中最后剩下的数字相关推荐
- 【算法-剑指 Offer】62. 圆圈中最后剩下的数字(环形链表;约瑟夫环;动态规划)
剑指 Offer 62. 圆圈中最后剩下的数字 - 力扣(LeetCode) 发布:2021年9月12日12:18:52 问题描述及示例 0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每 ...
- [剑指offer]面试题45:圆圈中最后剩下的数字
面试题45:圆圈中最后剩下的数字 题目:0,1,-,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. ❖ 经典的解法,用环形链表模拟圆圈 代 ...
- 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)
题目 0,1,2-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...
- 【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 ...
- 剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)
剑指offer--面试题45:圆圈中最后剩下的数字(孩子们的游戏) Solution1: 当年第一遍做时,自己想的垃圾算法 class Solution { public:int LastRemain ...
- LeetCode 面试题62. 圆圈中最后剩下的数字 详细题解
面试题62. 圆圈中最后剩下的数字 难度 简单 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数 ...
- 46. 孩子们的游戏-圆圈中最后剩下的数字
题目描述: 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机 ...
- Q45:圆圈中最后剩下的数字
备注:感觉这道题目的代码虽少,但理解起来还是有一定的难度,大家最好用纸和笔算算,仔细找一下映射前后函数的变化,是如何推导出递归式的. publicclass Q45圆圈中最后剩下的数字 {/*** 题 ...
最新文章
- AVL树入门(转载)
- Delphi动态事件
- 《深入理解分布式事务》第二章 MySQL 事务的实现原理
- 刚开完2019WWDC 苹果就被iOS开发者们集体起诉...
- WINDOWS蓝色当机画面解读
- go设置linux ip,设置linux虚拟机的静态ip-Go语言中文社区
- 【matlab】元胞数组的创建
- apt-get install 的参数(add-apt-repository)
- hdu 2222 Keywords Search ac自己主动机
- 分类网络 resnet
- 关于混合app 开发框架Ionic
- java软件更换皮肤怎么做_java窗体程序更换皮肤方法详细步骤
- 软件设计师---软件工程
- 阳光,无论清浅或明媚
- 破解Windows7开机密码
- 送你一个励志故事(转载)
- JavaScript 运算符与逻辑分支
- MLAT-Autoencoders for Conditional Risk Factors and Asset Pricing---上篇
- VBA脚本查找AS400 DSPMSG任务执行状态
- jackson多态序列化与反序列化
热门文章
- 课后实践9:以拼多多为例,原型设计
- python符号计算 漂亮地打印出来_让Python输出更漂亮:PrettyPrinter
- 量子计算 18 量子算法3 (RSA Shor)
- 利用JS实现简易ATM机
- Word控件Spire.Doc 【段落处理】教程(十五):在 C# 中为 Word 段落添加制表位
- jQuery遍历集合
- 毕业设计-基于机器学习的短期负荷预测算法
- 数据埋点几种方式介绍
- python 中文乱码 \u5b66\u90a6\u5ba2\u6237
- Vue2.0开发之——Vue基础用法-axios(29)