【剑指offer】圆圈中最后剩下的数字(约瑟夫问题),C++实现
原创博文,转载请注明出处!
# 题目
# 思路
本题即为典型的约瑟夫问题,通过递推公式倒推出问题的解。原始问题是从n个人中每隔m个数踢出一个人,原始问题变成从n-1个人中每隔m个数踢出一个人……
第一行表示每个人的下标,现在要从11个人中删除报数为3的人,从图中可以可看出最后7是胜利者。分析其中的规律:
第一轮中,11个人中胜利者7的角标是6;
第二轮中,10个人中胜利者7的角标是3;
第三轮中,9个人中胜利者7的角标是0;
第四轮中,8个人中胜利者7的角标是6;
第五轮中,7个人中胜利者7的角标是3;
第六轮中,6个人中胜利者7的角标是0;
第七轮中,5个人中胜利者7的角标是3;
第八轮中,4个人中胜利者7的角标是0;
第九轮中,3个人中胜利者7的角标是1;
第十轮中,2个人中胜利者7的角标是1;
第十一轮中,1个人中胜利者7的角标是0;
从第十一轮中倒推到第一轮:
从第十一轮中推出第十轮的角标数,f(2,3) = (f(1,3) + m) % 2 =(0+3) % 2 = 1
从第十轮中推出第九轮的角标数,f(3,3) = (f(2,3) + m) % 3 =(1+3) % 3 = 1
从第九轮中推出第八轮的角标数,f(4,3) = (f(3,3) + m) % 4 =(1+3) % 4 = 0
懒得写了…….
结论:从n个人中每隔m删除一人,递推公式为 f(n,m) = (f(n-1,m)+m) % n
# 代码
#include <iostream>
using namespace std; class Solution {
public:
// n表示多少个人,m表示随机数
int LastRemaining_Solution(int n, int m)
{
// 特殊输入
if(n == 0 || m < 0) return -1; // 递推公式计算
int res = 0;
for(int i = 1; i <= n; i++)
{
res = (res + m) % i;
cout<<res<<endl;
}
return res;
}
};
int main()
{
int n = 11;
int m = 3;
Solution solution;
solution.LastRemaining_Solution(n,m);
return 0;
}
【剑指offer】圆圈中最后剩下的数字(约瑟夫问题),C++实现的更多相关文章
- 剑指offer圆圈中最后剩下的数字 和 迭代器总结
迭代器只有++ ,--,==,!=四种运算方法,不能将iter = iteration+ 1,因为迭代器是指针类型,1是整数类型,不能直接相加赋值给一个指针. 题目描述 每年六一儿童节,牛客都会准备一 ...
- 剑指Offer——圆圈中最后剩下的数(约瑟夫环)
Question 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后, ...
- 剑指offer——圆圈中最后剩下的数字
1.如果通过环形列表去模拟圆圈的话,最后时间复杂度为O(mn),而且还需要一个辅助链表来模拟圆圈,空间复杂度为O(n). 2.通过找出递推公式的方法,求得递推公式为 时间复杂度为O(n),空间复杂度为 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题
剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ...
- 约瑟夫环形链表问题、丢手帕问题、剑指offer圆圈中最后一个数问题
public class Solution { // 左神解法,本题本质还是报数为m-1的倍数的人死.求最后一个活着的人是初始时候的哪个人 /* 报数(A) 实际人员编号(B) ...
- Leetcode_面试题62. 圆圈中最后剩下的数字(约瑟夫环)
经典的约瑟夫环,n个人排成一圈,第m个出队. 递归 code1 class Solution { public: int f(int n,int m){ if(n==1){ //递归边界,最后一个 r ...
- 《剑指offer》第六十二题(圆圈中最后剩下的数字)
// 面试题62:圆圈中最后剩下的数字 // 题目:0, 1, …, n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里 // 删除第m个数字.求出这个圆圈里剩下的最后一个数字. #inclu ...
- [剑指offer]62.圆圈中最后剩下的数字
62.圆圈中最后剩下的数字 题目 0,1,...,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成 ...
- 剑指offer46:圆圈中最后剩下的数字(链表,递归)
1 题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随 ...
随机推荐
- Redis中RedisTemplate和Redisson管道的使用
当对Redis进行高频次的命令发送时,由于网络IO的原因,会耗去大量的时间.所以Redis提供了管道技术,就是将命令一次性批量的发送给Redis,从而减少IO. 一.Jedis对redis的管道进行操 ...
- Tomcat access log配置(二)
前次讨论了spring boot 中添加Tomcat access log 是轻松愉快,配置文件中添加server.tomcat.accesslog即可,那么如果是外置的Tomcat容器又该如何配置呢 ...
- python 匹配中文和英文
在处理文本时经常会匹配中文名或者英文word,python中可以在utf-8编码下方便的进行处理. 中文unicode编码范围[\u4e00-\u9fa5] 英文字符编码范围[a-zA-Z] 此时匹配 ...
- POJ 2186 Popular Cows(强连通分量Kosaraju)
http://poj.org/problem?id=2186 题意: 一个有向图,求出点的个数(任意点可达). 思路: Kosaraju算法的第一次dfs是后序遍历,而第二次遍历时遍历它的反向图,从标 ...
- mac terminal update management pack
npm -g outdated npm -g install npm@6.4.1
- 高质量的C++博客
陈硕 :http://blog.csdn.net/Solstice 孟岩: http://blog.csdn.net/myan
- JavaScript设计模式与开发实践:惰性函数
Web开发中,因为浏览器之间的差异实现差异,一些嗅探工作总是不可避免的,比如我们需要在各个浏览器中能够通用事件绑定函数addEvent //一般写法 //缺点:当他每次被调用的时候都都会执行里面的if ...
- 关于Gulp
Gulp & webpack 配置详解http://www.jianshu.com/p/2d9ed1fe3e8c 使用 Gulphttp://hwaphon.site/?p=439 前端构建工 ...
- [嵌入式培训笔记]----Linux命令简介
Linux文件系统的结构类似一棵树,是从一个树根生长出来的.树根叫做/.从树根长出很多分叉,就这么一直生长下去.我们使用Linux操作系统的时候总是落在某个分叉上.ls命令可以帮助我们查看当前分叉上所 ...
- Vue实例的生命周期created和mounted的区别
生命周期先上图 什么是生命周期 Vue实例有一个完整的生命周期,也就是从开始创建.初始化数据.编译模板.挂载Dom.渲染→更新→渲染.卸载等一系列过程,我们称这是Vue的生命周期.通俗说就是Vue实例 ...