JavaC++题解与拓展——leetcode1823.找出游戏的获胜者【约瑟夫环】
每日一题做题记录,参考官方和三叶的题解 |
目录
- 题目要求
- 思路一:模拟
- Java
- C++
- 思路二:递归
- Java
- C++
- 思路三:迭代
- Java
- C++
- Rust
- 总结
题目要求
【这个问题似乎叫做约瑟夫环】
思路一:模拟
Java
- 用一个栈来模拟,将经过的小伙伴都重新加入队列,停驻位置小伙伴pop出去。
class Solution {public int findTheWinner(int n, int k) {Queue<Integer> queue = new ArrayDeque<Integer>();for(int i = 1; i <= n; i++)queue.offer(i);while(queue.size() > 1) {for(int i = 1; i < k; i++)queue.offer(queue.poll());queue.poll();}return queue.peek();}
}
- 时间复杂度:O(nk)O(nk)O(nk)
- 空间复杂度:O(n)O(n)O(n)
C++
- 用一个数组outoutout记录小伙伴淘汰与否,记录已淘汰人数cntcntcnt,直至只剩一人;
- 循环遍历寻找第kkk个未被淘汰的人,将其淘汰,从下一个未被淘汰的人开始下一次遍历。
- 遍历时起始下标为000,结果中起始下标为111,注意转换。
class Solution {public:int findTheWinner(int n, int k) {bool out[n + 10];memset(out, false, n + 10);int cnt = 0, cur = 0;while(cnt != n - 1) { // 淘汰人数!=n-1for(int j = 0; j < k - 1; j++) {cur++;while(out[cur % n]) // 第k个未被淘汰的人cur++;}out[cur % n] = true;cnt++;cur++;while(out[cur % n]) // 从下一个未被淘汰的人开始cur++;}return (cur % n) + 1;}
};
- 时间复杂度:O(n2)O(n^2)O(n2),要淘汰n−1n-1n−1个人,每淘汰一个人最多需遍历nnn个人。
- 空间复杂度:O(n)O(n)O(n)
思路二:递归
- 数学推导出规律直接递归;
- 约瑟夫环
- 函数简写为
f(n, k)
,表示淘汰nnn个人里的第kkk个; - 下一次淘汰的起始下标与本次相差kkk;
- 所以f(n,k)=k+f(n−1,k)f(n,k)=k+f(n-1,k)f(n,k)=k+f(n−1,k)
- 函数简写为
- 由于起始下标差异,结果为0时应返回nnn,可以先−1-1−1模后再加回来(Java),或者条件运算符判断(C++)。
Java
class Solution {public int findTheWinner(int n, int k) {if(n == 1)return 1;return (k + findTheWinner(n - 1, k) - 1) % n + 1;}
}
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(n)O(n)O(n),递归的栈开销
C++
class Solution {public:int findTheWinner(int n, int k) {if(n == 1)return 1;int res = (k + findTheWinner(n - 1, k)) % n;return res == 0 ? n : res;}
};
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(n)O(n)O(n),递归的栈开销
思路三:迭代
传统艺能之递归改迭代,省栈空间,思路一样。
Java
class Solution {public int findTheWinner(int n, int k) {int res = 1;for(int i = 2; i <= n; i++)res = (k + res - 1) % i + 1;return res;}
}
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1)
C++
class Solution {public:int findTheWinner(int n, int k) {int res = 1;for(int i = 2; i <= n; i++)res = (k + res - 1) % i + 1;return res;}
};
- 时间复杂度:O(n)O(n)O(n)
- 空间复杂度:O(1)O(1)O(1)
Rust
浅学一下rust
impl Solution {pub fn find_the_winner(n: i32, k: i32) -> i32 {(2..=n).fold(1, |ref mut res, i| {*res = (k + *res - 1) % i + 1;*res})}
}
总结
算是简单的题目,推导出规律很好实现。
最近想学学Rust就浅浅cv+了解一下……
欢迎指正与讨论! |
JavaC++题解与拓展——leetcode1823.找出游戏的获胜者【约瑟夫环】相关推荐
- Leetcode题库1823. 找出游戏的获胜者(约瑟夫环 C实现)
文章目录 思路 状态转移过程 状态转移方程 递归思路 迭代思路 补充 代码 递归 迭代 思路 状态转移过程 设 n 名小伙伴做游戏,计数为k 有n名小伙伴时,第一个离开的小伙伴编号为k,剩下n-1名小 ...
- 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分别表示)围坐在一张圆桌周围. ...
- golang力扣leetcode 1823.找出游戏的获胜者
1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 代码 1823.找出游戏的获胜者 1823.找出游戏的获胜者 题解 题目:n个位围成一个环,每次删除第k个人,求最后一个人是谁 思路:约瑟 ...
- 每日一题(2022-05-04)——找出游戏的获胜者
1823. 找出游戏的获胜者 题目描述: 题解: func findTheWinner(n int, k int) int {// eg:n=5 friends = [1,2,3,4,5] 里面的值就 ...
- 1823. 找出游戏的获胜者( 约瑟夫环问题 )
文章目录 Question Ideas 1.Answer( Java ) Code 2.Answer( Java ) Code 3.Answer( Java ) Code Question 1823. ...
- LeetCode 1823. 找出游戏的获胜者
LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...
最新文章
- python函数count_python中count函数知识点浅析
- LA 4328 Priest John's Busiest Day (Greedy)
- linux网络唤醒,如何在Ubuntu Server 18.04中启用网络唤醒(WOL)
- 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
- python解析不完全的html_【已解决】Scrapy的Python中如何解析部分的html字符串并格式化为html网页源码...
- 如何领导团队做好技术债管理?
- mysql远程定时任务_Linux下定时任务实现mysql自动备份并上传远程ftp
- PHP无法使用file_get_contents或者curl_init()函数解决办法
- 加密货币交易所Coinbase在私募股票市场中估值达900亿美元
- ofstream清空文件内容_回收站被删除的文件怎么恢复 回收站清空了怎么恢复
- c++重载++和--
- 嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )
- python基础 - networkx 绘图总结
- 开源软件、自由软件及免费软件的区别
- 【读书笔记】《解忧程序员》读后感
- 教育培训机构怎么做推广?有什么好建议?
- 如何做好SQLite 使用质量检测,让事故消灭在摇篮里
- nginx配置和优化详解
- <router-link>
- 为什么我从PR里面导出来的视频,在电脑上可以正常播放,但是上传到天猫、淘宝、抖音、微信等平台后就变的模糊,类似于重影的效果
热门文章
- 基于MDB_ICP协议的纸币识别器与自动售货机通讯的研究
- 评论:Ubiquiti Networking的UniFi是终极的专业家用网络解决方案
- 一个汽车软件测试工程师的三年工作总结
- 小米4s刷 android7,小米 MI 4S(小米4S 全网通 安卓7.0)获取Root权限服务含精简系统方案...
- tf.estimator.Estimator的使用
- max9286 四合一_美信推出GMSL四通道解串器MAX9286
- java 保存gif图片_java gif图片保存处理逻辑
- 【For非数学专业】通俗理解似然函数、概率、极大似然估计和对数似然
- HTML5视频标签 video 的 poster 属性
- 一荣俱荣,豪取多项冠军后荣耀着手年终奖改革