约瑟夫环: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 找出游戏的获胜者 (约瑟夫环问题)相关推荐

  1. LeetCode 1823. 找出游戏的获胜者 (约瑟夫环)

    思路 下图所演示的是1 ~ n的情况,下标0 ~ n-1同样适用 李永乐约瑟夫环讲解 代码实现(java) class Solution {public int findTheWinner(int n ...

  2. Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)

    文章目录 思路 状态转移过程 状态转移方程 递归思路 迭代思路 补充 代码 递归 迭代 思路 状态转移过程 设 n 名小伙伴做游戏,计数为k 有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小 ...

  3. leetcode刷题250天(65)——1823. 找出游戏的获胜者(约瑟夫环问题)

    解题思路: 每次都可以计算出失败者的位置和下一轮开始人的位置 不断删除.重新开始就能得到最后的获胜者 class Solution:def findTheWinner(self, n: int, k: ...

  4. 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)

    约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...

  5. LeetCode 1823. 找出游戏的获胜者

    LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...

  6. 约瑟夫环问题- leetcode 1823. 找出游戏的获胜者

    1823. 找出游戏的获胜者 使用链表模拟 class Solution {// 模拟public int findTheWinner(int n, int k) { List<Integer& ...

  7. golang力扣leetcode 1823.找出游戏的获胜者

    1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 代码 1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 题目:n个位围成一个环,每次删除第k个人,求最后一个人是谁 思路:约瑟 ...

  8. LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组

    937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...

  9. 1823. 找出游戏的获胜者( 约瑟夫环问题 )

    文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...

最新文章

  1. redis java 存储图片_Redis 存储图片 [base64/url/path]vs[object]
  2. 在项目中使用react
  3. Python基础(9)水仙花数
  4. 造假露馅!曾创下融资纪录的科技公司,被曝用印度码农冒充AI,挣了1个多亿...
  5. html5 规定input域,html5中关于input用法
  6. mysql my.cnf 官网_MySQL my.cnf 的配置
  7. 指针与数组关联导致的一些现象
  8. 利用浏览器调试功能 计算 百度网盘 文件数量 V2
  9. 帆软报表使用及设置日志打印sql
  10. 新随笔 注:关注后可阅读(持续更新--------)
  11. 《软件工程》真题考点
  12. 目前1KB文件夹快捷方式病毒扫清方法
  13. BZOJ1140: [POI2009]KOD 编码
  14. Spring - Spring事务控制详解与案例总结
  15. eclipse 换背景图片
  16. 域名策略服务器未运行,谈一谈网站突然无法访问的原因及解决策略
  17. 什么是架构?架构的本质和作用!
  18. 关于Ai打开图片,颜色变色问题
  19. 35岁后离职你还会去上班吗?
  20. java随机点名器_随机点名器(Java实现、读取txt文件)

热门文章

  1. 【摘要】STC系列单片机ISP编程器/烧录器的说明
  2. Android在Service中注册动态广播接收者
  3. 更换ruby源----RubyGems 镜像 - 淘宝网
  4. Canal 及canal.admin(v1.1.5)踩坑记录
  5. Visio之去除直线交叉处的跨线
  6. 一个快速的人脸检测库
  7. 维度数据建模的概念和术语
  8. Feign实现RPC调用
  9. Linux内核与编程
  10. 如何用【Python】制作一个二维码生成器