剑指offer——面试题45:圆圈中最后剩下的数字(孩子们的游戏)
剑指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) = [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:圆圈中最后剩下的数字(孩子们的游戏)相关推荐
- 剑指Offer - 面试题62. 圆圈中最后剩下的数字(约瑟夫环 递推公式)
1. 题目 0,1,-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次 ...
- 剑指offer 面试题62. 圆圈中最后剩下的数字
0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字 ...
- 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)
题目 0,1,2-,n-1这n个数字排成一个圆圈,从数字0开始,每次从这圆圈你删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...
- 【剑指offer-Java版】45圆圈中最后剩下的数字
圆圈中最后剩余的数字:约瑟夫环问题 0-n这n个数字排成一圈,从数字零开始每次从这个圆圈中删除第m个数字,求出剩余的最后一个数字 public class _Q45<T> {// 低效的模 ...
- 剑指offer第62题 圆圈中最后剩下的数字(约瑟夫问题)
文章目录 问题描述: 解题思路: 代码实现: 问题描述: 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3. ...
- 【剑指offer】62、圆圈中最后剩下的数字
题目 0~n-1这n个数字排成一个圆圈,从0开始,每次删除第m个数字,求出圆圈里剩下的最后一个数字 思路 直接用数组模拟圆圈,模拟删除的过程 class Solution { public:int L ...
- 剑指offer——面试题8:旋转数组的最小数字
剑指offer--面试题8:旋转数组的最小数字 Solution1: 自己想的复杂度为O(n)O(n)O(n)的算法,若用二分查找则: 1.代码复杂:2.最坏情况下的二分查找的时间复杂度亦为O(n)O ...
- 面试题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个数 ...
最新文章
- 重新认识创业者与资本的博弈
- 2014北京三险一金缴存比例
- python数组排序(递归实现)
- 自定义函数变量的设置(*/**),lambda匿名函数(map/filter/zip/enumerate)
- 阿里大数据分析与应用(part7)--机器学习平台PAI
- YbtOJ#20081-[NOIP2020模拟赛B组Day8]树上排列【组合数,树形dp】
- 前端学习(487):css选择器下
- matlab改变矩阵的元素,Matlab中元素不变情况下改变矩阵形态——reshape()
- Android学习笔记之图像颜色处理(ColorMatrix)
- 打造自己的专业图像工具-Visual C++ 2005图像编程系列【四】
- 2022“点点点”测试员如何上岸测试开发岗?附完整学习路线!
- 关于改良报告与学习总结(Ⅰ)
- 在Linux和qt下安装EasyPr遇到的问题
- 详解WIFI能用但是电脑不能上网怎么解决
- k8s 1.23 及keda 2.7.1 安装测试
- HEVC函数入门(22)——变换量化
- 机器学习代码整理pLSA、BoW、DBN、DNN
- 计算机中丢失audiodsp,AudioDsp.dll(缺失AudioDsp.dll文件修复工具)V1.0 免费版
- Spring Festival
- 天正服务器不显示,天正画图的时候图形消失看不见了怎么办?
热门文章
- 使用EDITPLUS编写C#控制台应用程序
- 前端笔记 | CSS定位
- 原生编辑器_微信小程序 广告原生模板广告
- swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?
- tinyint数据类型php筛选时怎么判断_PHP从入门到精通(三)PHP语言基础
- matlab软件编程求解方程实验报告,数学实验“线性方程组高斯消去法”实验报告内含matlab程序.doc...
- 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- ocienvcreate php 失败_win7 homebasic下,.net2008 连接oracle,提示错误OCIEnvCreate
- 将Python字符串转换为Int,将Int转换为String
- 函数重载函数的引用算重载吗_了解C ++中的函数重载