当前位置: 首页 > 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.dtcms.com/a/282421.html

相关文章:

  • 为什么要用erc165识别erc721或erc1155
  • 系统性学习C语言-第十八讲-C语言内存函数
  • IIS-网站报500.19错误代码0x8007000d问题解决
  • LeetCode Hot100【4. 寻找两个正序数组的中位数】
  • 什么是 WebClient?
  • xss-labs的小练
  • 基于faster-r-cnn行人检测和ResNet50+FPN的可见光红外图像多模态算法融合创新
  • VIVADO技巧_BUFGMUX时序优化
  • 比特币技术简史 第二章:密码学基础 - 哈希函数、公钥密码学与数字签名
  • 基于阿里云云服务器-局域网组网软件
  • Mfc初始化顺序
  • 【27】MFC入门到精通——MFC 修改用户界面登录IP IP Address Control
  • 虚幻引擎5 GAS开发俯视角RPG游戏 #06-7:无限游戏效果
  • 【28】MFC入门到精通——MFC串口 Combobox 控件实现串口号
  • 技术演进中的开发沉思-36 MFC系列: 对话框
  • Java并发编程(一)
  • LeetCode Hot 100 二叉树的最大深度
  • .NET 10 Preview 4 已发布
  • 【C# in .NET】9. 探秘委托:函数抽象的底层机制
  • 设置第三方窗口置顶(SetWindowPos方法,vb.net)
  • WMS仓储管理系统智能调控提升电子企业库存周转率
  • 系统启动流程分析
  • Linux-RAID
  • QML 五大对话框组件
  • 端口被占用时的解决问题
  • Egg.js × NestJS 2025 Nodejs后端框架选型指南
  • 代码随想录算法训练营十七天|二叉树part07
  • 【android bluetooth 协议分析 03】【蓝牙扫描详解 2】【app触发蓝牙扫描后,协议栈都做了那些事情】
  • 跨平台 App 如何无痛迁移到鸿蒙系统?全流程实战+Demo 教程
  • 八股文——包装类