Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)
约瑟夫环:1....n的数字围成一个圈,依次数数,到第K位的时候,从环里移除这个数字,直到剩余最后一个数字。
解法1:模拟,容易超时(不推荐)
解法2:倒推。时间复杂度O(n)
倒推思路:从最后的状态往前推导。
状态N,只有1个数字P,P数字的位置是0号位置。(P就是我们求得目标数字)
状态N-1,只有2个数字,其中有数字P,此时的P的位置要么0,要么1,根据K我们可以求得此时状态的P的位置。
状态N-2,只有3个数字,其中有数字P,此时P的位置在0,1,2。
以此类推......
初始状态,只有N个数字,其中有数字P,P的位置在0...N-1的位置。(此时P的位置就是我们要的结果)
这里必须注意:每个状态的起始计数位置是0号位置。
为了看起来更加直观,这里贴上一个例子: 以N = 5, K = 2为例。
状态N | P | ||||||
状态N-1 | P | X | |||||
状态N-2 | X | X | P | ||||
状态N-3 | P | X | X | X | |||
状态N-4 | X | X | P | X | X |
状态1 | 1 | 2 | 3 | 4 | 5 | ||
状态2 | 3 | 4 | 5 | 1 | |||
状态3 | 5 | 1 | 3 | ||||
状态4 | 3 | 5 | |||||
状态5 | 3 |
表格1是倒推的状态图
表格2是正推的状态图
正推的过程是:2号位置每次都移除,然后从后面的位置重新开始计数,所以当从0数到k-1的时候,K的位置变成了0号位置。
各状态间的关系:
根据上面的分析,我们可以再将各个状态的关系进行梳理:
P(N) = 0 初始状态,数字P在0号位置。只有一个数字P。
上一个状态N-1就是(P(N) + k) % 2,即N-1状态移除了一个数字,这个移除的数字+P(N)就是当前状态N-1的P的位置,因为是环所以需要mod(总数字个数)
所以P(n-1) = (P(N) + k) % 2
所以得出结论:
P(n) = 0
P(n-1) = (P(n) + K) % 2
P(n-2) = (P(n-1) + k) % 3
依次类推
得到P(1) = (P(2) + K) % n
class Solution {public int findTheWinner(int n, int k) {int pos = 0;//倒推法for(int i=2;i<=n;i++) {pos =(pos + k) % i;}return pos + 1;}
}
Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)相关推荐
- LeetCode 1823. 找出游戏的获胜者 (约瑟夫环)
思路 下图所演示的是1 ~ n的情况,下标0 ~ n-1同样适用 李永乐约瑟夫环讲解 代码实现(java) class Solution {public int findTheWinner(int n ...
- Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)
文章目录 思路 状态转移过程 状态转移方程 递归思路 迭代思路 补充 代码 递归 迭代 思路 状态转移过程 设 n 名小伙伴做游戏,计数为k 有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小 ...
- leetcode刷题250天(65)——1823. 找出游戏的获胜者(约瑟夫环问题)
解题思路: 每次都可以计算出失败者的位置和下一轮开始人的位置 不断删除.重新开始就能得到最后的获胜者 class Solution:def findTheWinner(self, n: int, k: ...
- 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)
约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...
- LeetCode 1823. 找出游戏的获胜者
LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...
- 约瑟夫环问题- leetcode 1823. 找出游戏的获胜者
1823. 找出游戏的获胜者 使用链表模拟 class Solution {// 模拟public int findTheWinner(int n, int k) { List<Integer& ...
- golang力扣leetcode 1823.找出游戏的获胜者
1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 代码 1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 题目:n个位围成一个环,每次删除第k个人,求最后一个人是谁 思路:约瑟 ...
- LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组
937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...
- 1823. 找出游戏的获胜者( 约瑟夫环问题 )
文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...
最新文章
- redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]
- 在项目中使用react
- Python基础(9)水仙花数
- 造假露馅!曾创下融资纪录的科技公司,被曝用印度码农冒充AI,挣了1个多亿...
- html5 规定input域,html5中关于input用法
- mysql my.cnf 官网_MySQL my.cnf 的配置
- 指针与数组关联导致的一些现象
- 利用浏览器调试功能 计算 百度网盘 文件数量 V2
- 帆软报表使用及设置日志打印sql
- 新随笔 注:关注后可阅读(持续更新--------)
- 《软件工程》真题考点
- 目前1KB文件夹快捷方式病毒扫清方法
- BZOJ1140: [POI2009]KOD 编码
- Spring - Spring事务控制详解与案例总结
- eclipse 换背景图片
- 域名策略服务器未运行,谈一谈网站突然无法访问的原因及解决策略
- 什么是架构?架构的本质和作用!
- 关于Ai打开图片,颜色变色问题
- 35岁后离职你还会去上班吗?
- java随机点名器_随机点名器(Java实现、读取txt文件)