每日一题做题记录,参考官方和三叶的题解

目录

  • 题目要求
  • 思路一:模拟
    • 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.找出游戏的获胜者【约瑟夫环】相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 每日一题(2022-05-04)——找出游戏的获胜者

    1823. 找出游戏的获胜者 题目描述: 题解: func findTheWinner(n int, k int) int {// eg:n=5 friends = [1,2,3,4,5] 里面的值就 ...

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

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

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

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

最新文章

  1. python函数count_python中count函数知识点浅析
  2. LA 4328 Priest John's Busiest Day (Greedy)
  3. linux网络唤醒,如何在Ubuntu Server 18.04中启用网络唤醒(WOL)
  4. 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
  5. python解析不完全的html_【已解决】Scrapy的Python中如何解析部分的html字符串并格式化为html网页源码...
  6. 如何领导团队做好技术债管理?
  7. mysql远程定时任务_Linux下定时任务实现mysql自动备份并上传远程ftp
  8. PHP无法使用file_get_contents或者curl_init()函数解决办法
  9. 加密货币交易所Coinbase在私募股票市场中估值达900亿美元
  10. ofstream清空文件内容_回收站被删除的文件怎么恢复 回收站清空了怎么恢复
  11. c++重载++和--
  12. 嵌入式 Linux 入门(四、Linux 下的编辑器 — 让人爱恨交加的 vi )
  13. python基础 - networkx 绘图总结
  14. 开源软件、自由软件及免费软件的区别
  15. 【读书笔记】《解忧程序员》读后感
  16. 教育培训机构怎么做推广?有什么好建议?
  17. 如何做好SQLite 使用质量检测,让事故消灭在摇篮里
  18. nginx配置和优化详解
  19. <router-link>
  20. 为什么我从PR里面导出来的视频,在电脑上可以正常播放,但是上传到天猫、淘宝、抖音、微信等平台后就变的模糊,类似于重影的效果

热门文章

  1. 基于MDB_ICP协议的纸币识别器与自动售货机通讯的研究
  2. 评论:Ubiquiti Networking的UniFi是终极的专业家用网络解决方案
  3. 一个汽车软件测试工程师的三年工作总结
  4. 小米4s刷 android7,小米 MI 4S(小米4S 全网通 安卓7.0)获取Root权限服务含精简系统方案...
  5. tf.estimator.Estimator的使用
  6. max9286 四合一_美信推出GMSL四通道解串器MAX9286
  7. java 保存gif图片_java gif图片保存处理逻辑
  8. 【For非数学专业】通俗理解似然函数、概率、极大似然估计和对数似然
  9. HTML5视频标签 video 的 poster 属性
  10. 一荣俱荣,豪取多项冠军后荣耀着手年终奖改革