尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

剑指offer-46、孩⼦们的游戏(圆圈中最后剩下的数)

剑指offer-46、孩⼦们的游戏(圆圈中最后剩下的数)
📅 发布时间:2026/6/19 14:55:54

题目描述

有个游戏是这样的:⾸先,让 n 个⼩朋友们围成⼀个⼤圈,⼩朋友们的编号是0~n-1。然后,随机指定⼀个数 m ,让编号为0的⼩朋友开始报数。每次喊到 m-1 的那个⼩朋友要出列唱⾸歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下⼀个⼩朋友开始,继续 0... m-1报数....这样下去....直到剩下最后⼀个⼩朋友,可以不⽤表演,并且拿到⽜客礼品,请你试着想下,哪个⼩朋友会得到这份礼品呢?

示例
输⼊:5,3
输出:2

思路及解答

数组模拟

通过布尔数组标记小朋友的出局状态

public class Solution {public int lastRemaining(int n, int m) {if (n <= 0 || m <= 0) return -1;boolean[] out = new boolean[n]; // 标记是否出局int count = n;                  // 剩余人数int index = 0;                  // 当前报数位置int step = 0;                   // 报数计数器while (count > 1) {// 如果当前小朋友未出局,参与报数if (!out[index]) {step++;// 报到m-1的小朋友出局if (step == m) {out[index] = true;  // 标记出局count--;            // 剩余人数减1step = 0;           // 重置计数器}}// 移动到下一个位置(循环)index = (index + 1) % n;}// 找到最后一个未出局的小朋友for (int i = 0; i < n; i++) {if (!out[i]) {return i;}}return -1;}
}
  • 时间复杂度:O(n×m),最坏情况下每个小朋友都需要报数m次
  • 空间复杂度:O(n),需要长度为n的布尔数组

循环链表

使用循环链表模拟小朋友围成的圈,将小朋友存入链表,循环删除第m个元素

public class Solution {public int lastRemaining(int n, int m) {if (n <= 0 || m <= 0) return -1;List<Integer> list = new LinkedList<>();// 初始化链表,存入所有小朋友编号for (int i = 0; i < n; i++) {list.add(i);}int index = 0; // 当前指针位置while (list.size() > 1) {// 计算要删除的位置:(当前索引 + m-1) % 当前大小index = (index + m - 1) % list.size();list.remove(index);// 删除后index自动指向下一个元素,不需要移动}return list.get(0);}
}
  • 时间复杂度:O(n×m),需要遍历链表进行删除操作
  • 空间复杂度:O(n),需要存储n个节点

数学归纳法(推荐)

分析每次被删除的数字规律,直接计算出最后的数字,不需要模拟

F(N,M) = ( F(N−1,M) + M ) % N

递推公式的推导过程:

  1. 第一次删除:从0开始报数,删除第(m-1)%n个小朋友
  2. 重新编号:删除后,从第m%n个小朋友开始重新编号:
    • 旧编号:m%n, m%n+1, ..., n-1, 0, 1, ..., m%n-1
    • 新编号:0, 1, 2, ..., n-2
  3. 映射关系:新编号x对应的旧编号为(x + m) % n

示例验证(n=5, m=3):

原始编号: 0, 1, 2, 3, 4
第一次删除编号2 → 剩余: 0, 1, 3, 4
重新编号: 3→0, 4→1, 0→2, 1→3
f(5,3) = (f(4,3) + 3) % 5
public class Solution {public int LastRemaining_Solution(int n, int m) {if (n <= 0 || m <= 0) {return -1;}int result = 0;for (int i = 2; i <= n; i++) {result = (result + m) % n;}return result;}
}
  • 时间复杂度:O(n),需要n次递归调用
  • 空间复杂度:O(n),递归调用栈深度

迭代优化

将递归转为迭代,避免栈溢出风险,是生产环境的最佳选择

public class Solution {public int lastRemaining(int n, int m) {if (n <= 0 || m <= 0) return -1;int result = 0; // f(1, m) = 0// 从2个人情况开始,逐步计算到n个人for (int i = 2; i <= n; i++) {result = (result + m) % i;}return result;}
}
  • 时间复杂度:O(n),只需一次循环
  • 空间复杂度:O(1),只使用常数空间

本文来自在线网站:seven的菜鸟成长之路,作者:seven,转载请注明原文链接:www.seven97.top

相关新闻

  • 2025年靠谱的冷却塔清淤机器人/污水池清淤机器人TOP品牌厂家排行榜
  • 2025年宁夏AI-GEO优化公司排行榜,深度解析汉唐数字传
  • 2025年PLC电控系统生产商排名推荐,看看哪家技术强

最新新闻

  • 2026伊春放心贵金属回收,CCIC 中检授权收黄金回收铂金回收白银回收持证实体门店 - 中安检金银铂钻回收
  • 天农凤中皇高端滋补鸡选购指南:如何挑选优质滋补禽肉 - 速递信息
  • 鉴源论坛 · 观擎丨DO-178C工具鉴定:从准则分级到操作需求的实战解析
  • Prescan8.5从零安装到MATLAB联调:避坑指南与最佳实践
  • 指纹浏览器行为生物指纹(下):键盘敲击节奏与滚动行为的仿生学建模
  • 大连闲置首饰变现攻略,本地高口碑回收门店合集 - 讯息早知道

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号