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

Solution1:

当年第一遍做时,自己想的垃圾算法

class Solution {
public:int LastRemaining_Solution(int n, int m) {vector<int> nums(n,0);int temp_count = 0, count = 0, i = 0; //nums[]初始化为n个0,temp_count检查是否到了m,count检查数组中1的数目是否到了n-1,i是计数用的while(count < n - 1) {if(nums[i] == 0) { //nums[i] == 0的情况,temp_count计数+1temp_count++;if(temp_count == m) { //temp_count到了mnums[i] = 1;count++;temp_count = 0;i++;if(i == n)i = 0;}else { //temp_count未到mi++;if(i == n)i = 0;}}else { //nums[i]==1的情况,直接跳过i++;if(i == n)i = 0;}}for(i = 0; i < n; i++){if(nums[i] == 0)return i;}return -1; //无解情况返回-1,一般都这样}
};

Solution2:

20190910重做。
书上的思路1:用链表模拟圆圈。
学习的两个点:
1.list(双向链表)和forward_list(单向链表),链接:https://blog.csdn.net/u013006553/article/details/78158717
2.顺序容器中利用迭代器和erase()函数删除元素,参考博客:https://blog.csdn.net/Allenlzcoder/article/details/82560220

public://用环形链表模拟圆圈int LastRemaining_Solution(int n, int m) { if (n < 1 || m < 1) return -1;int i = 0;//STL中的双向链表list容器,再任何位置插入和删除非常快list<int> nums;for (int i = 0; i < n; i++)nums.push_back(i);auto cur = nums.begin();while (nums.size() > 1) {for (int i = 1; i < m; i++) {cur++;if (cur == nums.end())cur = nums.begin();}//erase()返回下一个有效的迭代器cur = nums.erase(cur);if (cur == nums.end())cur = nums.begin();}return *cur;}
};

Solution3:

20190910重做。
书上的思路2:推导公式。除非碰上重题或类似题,否则真不容易想到类似的方法。

f(n,m)=0 (n=1)f(n,m)=0(n=1)

f(n, m) = 0  (n = 1)

f(n,m)=[f(n−1,m)+m]f(n,m)=[f(n−1,m)+m]

f(n, m) = [f(n-1, m) +m] % n  (n > 1)
代码:

class Solution {
public:int LastRemaining_Solution(int n, int m) {if (n < 1 || m < 1) return -1;int last = 0;for (int i = 2; i <= n; i++)last = (last + m) % i;return last;}
};

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

  1. 剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)

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

  2. 剑指offer 面试题62. 圆圈中最后剩下的数字

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

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

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

  4. 【剑指offer-Java版】45圆圈中最后剩下的数字

    圆圈中最后剩余的数字:约瑟夫环问题 0-n这n个数字排成一圈,从数字零开始每次从这个圆圈中删除第m个数字,求出剩余的最后一个数字 public class _Q45<T> {// 低效的模 ...

  5. 剑指offer第62题 圆圈中最后剩下的数字(约瑟夫问题)

    文章目录 问题描述: 解题思路: 代码实现: 问题描述: 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3. ...

  6. 【剑指offer】62、圆圈中最后剩下的数字

    题目 0~n-1这n个数字排成一个圆圈,从0开始,每次删除第m个数字,求出圆圈里剩下的最后一个数字 思路 直接用数组模拟圆圈,模拟删除的过程 class Solution { public:int L ...

  7. 剑指offer——面试题8:旋转数组的最小数字

    剑指offer--面试题8:旋转数组的最小数字 Solution1: 自己想的复杂度为O(n)O(n)O(n)的算法,若用二分查找则: 1.代码复杂:2.最坏情况下的二分查找的时间复杂度亦为O(n)O ...

  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个数 ...

最新文章

  1. 重新认识创业者与资本的博弈
  2. 2014北京三险一金缴存比例
  3. python数组排序(递归实现)
  4. 自定义函数变量的设置(*/**),lambda匿名函数(map/filter/zip/enumerate)
  5. 阿里大数据分析与应用(part7)--机器学习平台PAI
  6. YbtOJ#20081-[NOIP2020模拟赛B组Day8]树上排列【组合数,树形dp】
  7. 前端学习(487):css选择器下
  8. matlab改变矩阵的元素,Matlab中元素不变情况下改变矩阵形态——reshape()
  9. Android学习笔记之图像颜色处理(ColorMatrix)
  10. 打造自己的专业图像工具-Visual C++ 2005图像编程系列【四】
  11. 2022“点点点”测试员如何上岸测试开发岗?附完整学习路线!
  12. 关于改良报告与学习总结(Ⅰ)
  13. 在Linux和qt下安装EasyPr遇到的问题
  14. 详解WIFI能用但是电脑不能上网怎么解决
  15. k8s 1.23 及keda 2.7.1 安装测试
  16. HEVC函数入门(22)——变换量化
  17. 机器学习代码整理pLSA、BoW、DBN、DNN
  18. 计算机中丢失audiodsp,AudioDsp.dll(缺失AudioDsp.dll文件修复工具)V1.0 免费版
  19. Spring Festival
  20. 天正服务器不显示,天正画图的时候图形消失看不见了怎么办?

热门文章

  1. 使用EDITPLUS编写C#控制台应用程序
  2. 前端笔记 | CSS定位
  3. 原生编辑器_微信小程序 广告原生模板广告
  4. swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?
  5. tinyint数据类型php筛选时怎么判断_PHP从入门到精通(三)PHP语言基础
  6. matlab软件编程求解方程实验报告,数学实验“线性方程组高斯消去法”实验报告内含matlab程序.doc...
  7. 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  8. ocienvcreate php 失败_win7 homebasic下,.net2008 连接oracle,提示错误OCIEnvCreate
  9. 将Python字符串转换为Int,将Int转换为String
  10. 函数重载函数的引用算重载吗_了解C ++中的函数重载