当前位置: 首页 > news >正文

剑指offer64_圆圈中最后剩下的数字

圆圈中最后剩下的数字


0,1,…,n−1 这 n 个数字 (n>0) 排成一个圆圈,从数字 0 开始每次从这个圆圈里删除第 m 个数字。

求出这个圆圈里剩下的最后一个数字。

数据范围

1≤n,m≤4000

样例2
输入:n=5 , m=3输出:3

算法思路

这是一个经典的约瑟夫环问题(Josephus problem)的递归解法。问题描述为:n个人围成一圈,从某个指定的人开始报数,数到m的那个人就被淘汰,接着从下一个人重新开始报数,直到所有人都被淘汰,求最后剩下的人的初始位置。

递归思路:

  1. 基本情况:当只有1个人时(n=1),这个人是最后剩下的,返回0(表示初始位置是0)
  2. 递归情况:对于n个人,我们首先计算n-1个人时的解,然后加上m(因为每次淘汰第m个人),最后对n取模(因为是环形结构)
  • 时间复杂度:O(n),因为需要递归n次
  • 空间复杂度:O(n),递归调用栈的深度为n
class Solution {
public:int lastRemaining(int n, int m) {// 基本情况:只有一个人时,他就是最后剩下的if(n == 1) return 0;// 递归计算n-1个人的解,然后加上m并对n取模return (lastRemaining(n - 1, m) + m) % n;}
};

实例演示

示例:n=5, m=3

  1. lastRemaining(5,3) = (lastRemaining(4,3)+3)%5
  2. lastRemaining(4,3) = (lastRemaining(3,3)+3)%4
  3. lastRemaining(3,3) = (lastRemaining(2,3)+3)%3
  4. lastRemaining(2,3) = (lastRemaining(1,3)+3)%2
  5. lastRemaining(1,3) = 0 (基本情况)
  6. 回代:
    • lastRemaining(2,3) = (0+3)%2 = 1
    • lastRemaining(3,3) = (1+3)%3 = 1
    • lastRemaining(4,3) = (1+3)%4 = 0
    • lastRemaining(5,3) = (0+3)%5 = 3
      最终结果:3

优化建议

这个递归解法虽然简洁,但当n很大时可能会导致栈溢出。可以改用迭代方法来优化空间复杂度:

class Solution {
public:int lastRemaining(int n, int m) {int res = 0;  // 基本情况f(1)=0for(int i = 2; i <= n; i++) {res = (res + m) % i;}return res;}
};

迭代版本的空间复杂度降为O(1),更适合处理大规模输入。

http://www.xdnf.cn/news/1132921.html

相关文章:

  • 分块(chunked) vs 滑动窗口(windowed)
  • 力扣面试150(31/150)
  • Python爬虫实战:研究PyYAML库相关技术
  • 工作第一步建立连接——ssh
  • STM32硬件I2C的注意事项
  • UniApp 多端人脸认证图片上传实现
  • Sketch 与 Figma
  • 基于 Python/PHP/Node.js 的淘宝 API 商品数据抓取开发教程
  • 个人笔记(linux/sort与uniq命令)
  • [硬件电路-28]:从简单到复杂:宇宙、芯片与虚拟世界的共通逻辑
  • 快速掌握 Kafka:从核心概念到生产级部署指南
  • 网络安全初级(XSS-labs 1-8)
  • 基于Canal实现MySQL数据库数据同步
  • 数字IC后端培训教程之数字后端项目典型项目案例解析
  • 端侧推理软件栈
  • 智慧农业新图景:物联网如何精准守护作物生长​
  • FCN语义分割笔记(1)
  • XSS-labs 1-8关
  • 系统性学习C语言-第十八讲-C语言内存函数
  • 从零开始的云计算生活——番外4,使用 Keepalived 实现 MySQL 高可用
  • xss-lab1-8关
  • AWS ML Specialist 考试备考指南
  • Liunx练习项目6-创建dns服务器
  • 图机器学习(10)——监督学习中的图神经网络
  • AI Agent开发学习系列 - langchain之LCEL(1):LangChain LCEL链式编排与RAG增强实践
  • 新手向:自动化图片格式转换工具
  • orfeotoolbox ResetMargin
  • 硬件设计学习DAY3——电源Buck电路深度解析:CCM/DCM/BCM模式与电感设计
  • Linux运维新手的修炼手扎之第21天
  • 【论文阅读】A Survey on Knowledge-Oriented Retrieval-Augmented Generation(4)