一、题目

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. 圆圈中最后剩下的数字相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. AVL树入门(转载)
  2. Delphi动态事件
  3. 《深入理解分布式事务》第二章 MySQL 事务的实现原理
  4. 刚开完2019WWDC 苹果就被iOS开发者们集体起诉...
  5. WINDOWS蓝色当机画面解读
  6. go设置linux ip,设置linux虚拟机的静态ip-Go语言中文社区
  7. 【matlab】元胞数组的创建
  8. apt-get install 的参数(add-apt-repository)
  9. hdu 2222 Keywords Search ac自己主动机
  10. 分类网络 resnet
  11. 关于混合app 开发框架Ionic
  12. java软件更换皮肤怎么做_java窗体程序更换皮肤方法详细步骤
  13. 软件设计师---软件工程
  14. 阳光,无论清浅或明媚
  15. 破解Windows7开机密码
  16. 送你一个励志故事(转载)
  17. JavaScript 运算符与逻辑分支
  18. MLAT-Autoencoders for Conditional Risk Factors and Asset Pricing---上篇
  19. VBA脚本查找AS400 DSPMSG任务执行状态
  20. jackson多态序列化与反序列化

热门文章

  1. 课后实践9:以拼多多为例,原型设计
  2. python符号计算 漂亮地打印出来_让Python输出更漂亮:PrettyPrinter
  3. 量子计算 18 量子算法3 (RSA Shor)
  4. 利用JS实现简易ATM机
  5. Word控件Spire.Doc 【段落处理】教程(十五):在 C# 中为 Word 段落添加制表位
  6. jQuery遍历集合
  7. 毕业设计-基于机器学习的短期负荷预测算法
  8. 数据埋点几种方式介绍
  9. python 中文乱码 \u5b66\u90a6\u5ba2\u6237
  10. Vue2.0开发之——Vue基础用法-axios(29)