C++约瑟夫环(又称丢手绢)解决---最简单的理解
首先约瑟夫环的定义:
在一间房间总共有n个人(下标0~n-1),只能有最后一个人活命。
按照如下规则去排除人:
所有人围成一圈,
从0开始 顺时针报数,
每次报到m的人将被排除掉
被排除掉的人将从房间内被移走
然后从被kill掉的下一个人重新报数,继续报到m,再清除,直到剩余一人
是不是和丢手绢问题类似,那么我们反向思考问题,第一轮报数被kill的人和第二轮被kill的人是不是他们之间的下标的差一定为m,(因为每次都要从0开始报数),一直这样kill下去是不是最后只会剩下一个人,那这个人报数(下标)一定为0,我们反向寻找上一轮被kill的人和这个人报数差也一定为m,如此每一轮kill跟下一轮被kill的人报数差均为m。
一个人的时候: 这个活着的人的下标是0. 所以需要知道当两个人存在的时候,这个人的下标是多少;
两个人的时候: 这个活着的人下标:(0+m)%2=1 所以需要知道当三个人存在的时候 ,这个人的下标是多少;
三个人的时候: 这个活着的人下标:(1+m)%3=1 所以需要知道当四个人存在的时候 ,这个人的下标是多少;
如此类推,我们设定一个find(n,m)为第一轮要被kill的人那么,下一轮要被kill的就是(find(n-1,m))find(n,m)=(find(n-1,m)+m)%n;如此可反向寻找最后幸存的那个人是谁。
(注意%设置是为了下标不能超过队列总数即人数)
方法一:递归
class Solution {public:int lastRemaining(int n, int m) {return find(n, m);}int find(int n, int m) {if (n == 1) {return 0;}int x = find(n - 1, m);return (x + m) % n;}
};
方法二:简单迭代
class Solution1 {public:int lastRemaining(int n, int m) {int end = 0;for (int i = 2; i <= n; i++) {end = (end + m) % i;}return end;}
};
C++约瑟夫环(又称丢手绢)解决---最简单的理解相关推荐
- vivo2020校招笔试题[编程题]报数(约瑟夫问题又称丢手绢问题)-java解决
今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号.人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是: 将N(N<10000)个人排成一排,从第 ...
- 约瑟夫环(丢手绢问题)
文章目录 问题描述 思路 代码实现 问题描述 有 1~N 个数字,从 1~m 依次报数,数到 m 的数字要被删掉,求最后剩下的数字是? 思路 第一次报数 第二次报数 1 n-m+1 2 n-m+2 - ...
- Java数据结构单向循环链表实现约瑟夫问题(丢手绢)
环形链表 实例:使用环形链表解决约瑟夫问题(丢手绢) 构建一个单向环形链表思路 1)先创建第一个节点,让first指向该节点,并形成环形 2)加入环形链表 遍历环形链表 1)先让一个辅助指 ...
- C语言处理约瑟夫问题(丢手绢)
(部分经验援引自其他人) 问题描述: 在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆 ...
- Java中使用链表解决约瑟夫问题(丢手绢问题)
文章目录 文章目录 前言 一.思路分析 二.代码实现 1.Chird类建立 2.链表创建 3.功能实现 总结 其他解决方式: Java中使用list解决约瑟夫问题https://blog.csdn.n ...
- Java中使用list解决约瑟夫问题(丢手绢问题)
文章目录 文章目录 前言 一.思路分析 二.代码实现 总结 其他解决方式: Java中使用环形链表解决约瑟夫问题https://blog.csdn.net/qq_35813811/article/de ...
- C语言解决经典问题约瑟夫环--数组
什么时约瑟夫环问题? 约瑟夫问题,是一个计算机科学和数学中的问题,在计算机编程的算法中,类似问题又称为约瑟夫环,又称"丢手绢问题". 问题的大致内容就是:一共有N个人,从1开始报数 ...
- 一文读懂约瑟夫环算法
2020-05-25 20:13:40 作者 | 扬帆向海 责编 | 王晓曼 出品 | CSDN博客 问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的 ...
- 一文读懂约瑟夫环算法 | 原力计划
作者 | 扬帆向海 责编 | 王晓曼 出品 | CSDN博客 问题描述 约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题.在计算机编程的算法中,类似问题又称为约瑟夫环.又称&q ...
最新文章
- Gerrit 代码审核服务器的工作流和原理
- 2019全球高引学者榜单出炉:中国735人次入选增速第一,计算机学科蝉联第一,中科院首次入围全球前三...
- 安卓实现记住密码登陆功能
- javascript的垃圾回收机制指的是什么?
- Java Virtual Machine Garbage Collection浅析
- struts2随笔(一)Action、struts.xml、Interceptor细节
- date字段 http 头文件_HTTP头文件获取
- python英文版怎么改成中文版_“PyQt的Qt Designer菜单是中文版的,怎么改成英文的“python的qt designer教程...
- luogu2680 运输计划
- 25.TCP/IP 详解卷1 --- SNMP:简单网络管理协议
- 方正电脑如何关闭网络启动计算机,方正电脑怎么进安全模式
- Android屏幕适配(SmallestWidth适配 sw限定符)最新步骤解析
- Lambert 投影转换相关代码
- Excel怎么设置单元格的边框
- 高级程序员解决问题的思维模式和普通程序员的区别在哪里?
- 什么是公约数/公因数
- java解析8583报文55域
- TheOpenGroupDPBoK个人认证计划
- AFL入门学习<AFL 下载和安装>
- [537.A]2019-08-03(星期六)登顶梧桐山邀请