Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)
文章目录
- 思路
- 状态转移过程
- 状态转移方程
- 递归思路
- 迭代思路
- 补充
- 代码
- 递归
- 迭代
思路
状态转移过程
设 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实现)相关推荐
- leetcode刷题250天(65)——1823. 找出游戏的获胜者(约瑟夫环问题)
解题思路: 每次都可以计算出失败者的位置和下一轮开始人的位置 不断删除.重新开始就能得到最后的获胜者 class Solution:def findTheWinner(self, n: int, k: ...
- Leetcode 1823 找出游戏的获胜者 (约瑟夫环问题)
约瑟夫环:1....n的数字围成一个圈,依次数数,到第K位的时候,从环里移除这个数字,直到剩余最后一个数字. 解法1:模拟,容易超时(不推荐) 解法2:倒推.时间复杂度O(n) 倒推思路:从最后的状态 ...
- LeetCode 1823. 找出游戏的获胜者 (约瑟夫环)
思路 下图所演示的是1 ~ n的情况,下标0 ~ n-1同样适用 李永乐约瑟夫环讲解 代码实现(java) class Solution {public int findTheWinner(int n ...
- 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)
约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...
- LeetCode 937. 重新排列日志文件 / 1823. 找出游戏的获胜者(约瑟夫环问题) / 713. 乘积小于 K 的子数组
937. 重新排列日志文件 2022.5.3 每日一题 题目描述 给你一个日志数组 logs.每条日志都是以空格分隔的字串,其第一个字为字母与数字混合的 标识符 . 有两种不同类型的日志: 字母日志: ...
- LeetCode 1823. 找出游戏的获胜者
LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...
- 每日一道leetcode(python)1823. 找出游戏的获胜者
每日一道leetcode(python)1823. 找出游戏的获胜者 2021-08-07 共有 n 名小伙伴一起做游戏.小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号.确切地说,从第 i 名 ...
- golang力扣leetcode 1823.找出游戏的获胜者
1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 代码 1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 题目:n个位围成一个环,每次删除第k个人,求最后一个人是谁 思路:约瑟 ...
- 约瑟夫环问题- leetcode 1823. 找出游戏的获胜者
1823. 找出游戏的获胜者 使用链表模拟 class Solution {// 模拟public int findTheWinner(int n, int k) { List<Integer& ...
最新文章
- 深拷贝——将对象拷贝到底
- VS2008中文正式版发布了,附下载链接!
- 抽奖系统的流量削峰方案
- mysql 常用字符串操作
- 春节档总票房已破50亿 情人节单日票房超14亿
- vue执行操作成功但页面不刷新_vue.js数据更新页面不刷新
- 迭代时移除List中的元素的正确方式
- html注释js,JavaScript 注释
- 如何破解(免积分)下载百度文库+豆丁收费文档
- 机器学习-基于Logistic回归和Sigmoid函数的分类
- java反射之 Field对象
- windows10 开启热点
- DoubanFm之设计模式(一)
- 做一个登陆效果,输入用户名和密码,如果用户名是:张三,密码是:123就提示登陆成功,否则提示登录失败。
- Matplotlib数据可视化画图
- 喜欢你,才不顾一切的作践自己:QQ伤感日志
- 数据结构与算法之美笔记-链表(Linked list)
- 不可不知的潮流文化、新词汇, 00后聊天词汇
- kubernetes增加删除master节点操作
- Golang2022最全面试题整理(附资料)