文章目录

  • 思路
    • 状态转移过程
    • 状态转移方程
    • 递归思路
    • 迭代思路
    • 补充
  • 代码
    • 递归
    • 迭代

思路

状态转移过程

设 n 名小伙伴做游戏,计数为k

有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小伙伴
此时从k+1开始重新计数,若n-1名小伙伴里获胜者编号为p1
那么n名小伙伴里,p1的编号应该是p = k + p1

n-1名小伙伴时,第一个离开的小伙伴编号为k+1+(k-1)=2k,剩下n-2名小伙伴
此时从2k+1开始重新计数,若n-2名小伙伴里获胜者编号为p2
那么n-1名小伙伴里,p2的编号应该是p1 = p2 + k
n名小伙伴里,p2的编号应该是p = (p2 + k) + k
……

状态转移方程

设 n 名小伙伴做游戏,计数为k时,获胜者编号为f(n,k)
由上面推导可知,f(n,k) 与f(n-1,k)的关系如下
f(n,k) = f(n-1,k) + k
因为编号大小不可能超过n,于是有如下修正
f(n,k) = (f(n-1,k) + k)%n

递归思路

模拟上述状态转移方程即可

迭代思路

利用上述状态转移方程
从1名小伙伴的情况 f(1,k),计算2名小伙伴的情况 f(2,k),直至推导到n名小伙伴 f(n,k)

补充

这里给出我几年前第一次遇到约瑟夫环时的题解 链接

代码

递归

参考代码

int findTheWinner(int n, int k){if(n == 1) return 1;int ans = findTheWinner(n - 1, k) + k;return ans % n == 0? n: (ans % n);
}

迭代

参考代码

int findTheWinner(int n, int k){int winner = 1;for (int i = 2; i <= n; i++) {winner = (k + winner - 1) % i + 1;}return winner;
}

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

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

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

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

    约瑟夫环:1....n的数字围成一个圈,依次数数,到第K位的时候,从环里移除这个数字,直到剩余最后一个数字. 解法1:模拟,容易超时(不推荐) 解法2:倒推.时间复杂度O(n) 倒推思路:从最后的状态 ...

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

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

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

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

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

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

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

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

  7. 每日一道leetcode(python)1823. 找出游戏的获胜者

    每日一道leetcode(python)1823. 找出游戏的获胜者 2021-08-07 共有 n 名小伙伴一起做游戏.小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号.确切地说,从第 i 名 ...

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

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

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

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

最新文章

  1. 深拷贝——将对象拷贝到底
  2. VS2008中文正式版发布了,附下载链接!
  3. 抽奖系统的流量削峰方案
  4. mysql 常用字符串操作
  5. 春节档总票房已破50亿 情人节单日票房超14亿
  6. vue执行操作成功但页面不刷新_vue.js数据更新页面不刷新
  7. 迭代时移除List中的元素的正确方式
  8. html注释js,JavaScript 注释
  9. 如何破解(免积分)下载百度文库+豆丁收费文档
  10. 机器学习-基于Logistic回归和Sigmoid函数的分类
  11. java反射之 Field对象
  12. windows10 开启热点
  13. DoubanFm之设计模式(一)
  14. 做一个登陆效果,输入用户名和密码,如果用户名是:张三,密码是:123就提示登陆成功,否则提示登录失败。
  15. Matplotlib数据可视化画图
  16. 喜欢你,才不顾一切的作践自己:QQ伤感日志
  17. 数据结构与算法之美笔记-链表(Linked list)
  18. 不可不知的潮流文化、新词汇, 00后聊天词汇
  19. kubernetes增加删除master节点操作
  20. Golang2022最全面试题整理(附资料)

热门文章

  1. 量化策略篇:股票多头策略、CTA策略、期权策略
  2. 【平衡小车制作】(七)串级PID调参及平衡成果展示(超详解)
  3. STM32开发笔记112:ADS1258驱动设计——读寄存器
  4. Java爬虫获取豆瓣的短评数据
  5. [原创]-数据仓库ETL开发
  6. 苹果怎么取消微信订阅服务器,教程:取消微信免密支付授权功能设置
  7. [Win32]画笔和规则区域填充
  8. 4W家庭理财常见问题及解决方法
  9. HTML---表格合并(详解)
  10. vmware搭建多台虚拟机-桥接模式