剑指Offer62 -- 约瑟夫环
1. 题目描述
圆圈中最后剩下的数字
2. 约瑟夫环
人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,处刑下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方向跳过相同数量的人,直到只剩下一个人,并被释放。
3. 思路
下面主要是对参考题解的补充说明。
现在正式开始😊
我们现在假设有一个长度为 n n n 的数组 a a a,数组下标从 0 0 0 开始,每数 m m m 个数就删除当前位置的元素,直到只剩下一个元素。第一次删除 a [ k ] a[k] a[k], k = ( m − 1 ) % n k=(m-1)\%n k=(m−1)%n(考虑 m > n m>n m>n的情况),那么删除 a [ k ] a[k] a[k],之后,原数组就变成了:
a [ k + 1 ] , a [ k + 2 ] , . . . , a [ n − 1 ] , a [ 0 ] , a [ 1 ] , . . . a [ k − 1 ] a[k + 1], a[k + 2], ... , a[n - 1], a[0], a[1], ... a[k - 1] a[k+1],a[k+2],...,a[n−1],a[0],a[1],...a[k−1](到了头就重新从下标 0 0 0 处开始)
仔细看的话,这里,我们没有标明 a [ k ] a[k] a[k],说明它的确被删除了。
哎,你可能会问,怎么可能真的把它删除了啊(况且代码中确实没有“删除”动作),我们在模拟的时候,对于“删除”的元素,都是跳过,既然都跳过了,说明它的的确确真真实实的存在啊!
错了!此删除非彼删除!先别急!
现在,我们删除了一个元素,新数组就是上面的样子,我们需要删除第二个元素,但是,他的位置不是 k = ( m − 1 ) % n k=(m-1)\%n k=(m−1)%n 了,而是 k = ( m − 1 ) % ( n − 1 ) k=(m-1)\%(n-1) k=(m−1)%(n−1)。
删除位置的变化非常非常关键!我们通过缩减数组的大小,使得我们通过忽略 a [ k ] a[k] a[k] 以达到删除 a [ k ] a[k] a[k] 的目的,因为 a [ k ] a[k] a[k] 如果存在的话,它就在 a [ k − 1 ] a[k-1] a[k−1] 的后面,也就是长度为 n n n 的数组的最后一个元素,但是现在数组长度为 n − 1 n-1 n−1 了,所以 a [ k ] a[k] a[k] 不就相当于被删除了吗?
往下同理,当我们删除了 c n t cnt cnt 个元素之后, k = ( m − 1 ) % ( n − c n t ) k=(m-1)\%(n-cnt) k=(m−1)%(n−cnt)。
好了,我们已经解释完了,通过什么样的方法来实现模拟过程中跳过被删除的元素,就是把它放到数组末尾,然后删除。
但是!问题来了!虽然说,我们可以找到 k k k 的位置,但是你没办法把数组 a a a 转换为下面形式:
删除一个元素之后的新数组: a [ k + 1 ] , a [ k + 2 ] , . . . , a [ n − 1 ] , a [ 0 ] , a [ 1 ] , . . . a [ k − 1 ] a[k + 1], a[k + 2], ... , a[n - 1], a[0], a[1], ... a[k - 1] a[k+1],a[k+2],...,a[n−1],a[0],a[1],...a[k−1]
因为, a [ 0 ] a[0] a[0] 就是 a [ 0 ] a[0] a[0], a [ k + 1 ] a[k+1] a[k+1] 就是 a [ k + 1 ] a[k+1] a[k+1],你说 原数组中的 a [ k + 1 ] a[k+1] a[k+1] 相当于 新数组的 a [ 0 ] a[0] a[0],他就是新数组中的 a [ 0 ] a[0] a[0] 啊?
确实,我们假象,删除一个元素后,新数组的头是原数组的 a [ k + 1 ] a[k+1] a[k+1],但是事实是残酷的,数组的头仍然是原数组的 a [ 0 ] a[0] a[0]
那么,有问题就解决问题,怎么办呢?最简单的办法,用一个 f o r for for 循环移动元素,让 a [ 0 ] a[0] a[0] 真的等于 a [ k + 1 ] a[k+1] a[k+1]
但这也太笨了! o f f e r offer offer 是留给不走寻常路之人的!
我们可以通过映射大法,虚假的让原数组的 a [ k + 1 ] a[k+1] a[k+1] 等于新数组的 a [ 0 ] a[0] a[0],因为新数组的理论下标是连续的(从 0 0 0 到 n − 2 n-2 n−2)
我们指望被映射的下标也是连续的(取模意义下): k + 1 , k + 2 , . . . n − 1 , 0 , 1 , . . . k − 1 k+1, k+2, ... n-1, 0, 1, ...k-1 k+1,k+2,...n−1,0,1,...k−1
既然两个数组都是连续的,我们当然可以将我们希望的数组下标(从 k + 1 k+1 k+1 开始的)映射到实际的数组下标(从 0 0 0 开始的)了!
接下来映射部分参考题解就好了!
总之,思路很简单!只需要搞清楚两个问题:
- 如果模拟删除行为
- 如何将被删除元素的下一个位置开始的元素作为数组的第一个元素
另外,你可能会问为啥我们必须要映射呢?我们设置一个变量 s t a r t I n d e x = k + 1 startIndex=k+1 startIndex=k+1,然后让他递增(取模状态下)不久好了?这样不也能实现映射的行为吗?
也就与我们递归的意义有关了。
我们的递归函数 l a s t R e m a i n i n g ( i n t n , i n t m ) lastRemaining(int n, int m) lastRemaining(intn,intm) 表示,删除从 0 0 0 到 n − 1 n-1 n−1 一共 n n n 个元素中的 m m m 个数,最后剩下的数。
他的第一个数就是 0 0 0,最后一个数就是 n − 1 n-1 n−1。。。
4. 代码
class Solution {
public:int lastRemaining(int n, int m) {if(n == 1) return 0;return (lastRemaining(n - 1, m) + m) % n;}
};
5. 参考
数学推理–映射
6. 其它题目
求出队序列
相关文章:
剑指Offer62 -- 约瑟夫环
1. 题目描述 圆圈中最后剩下的数字 2. 约瑟夫环 人们站在一个等待被处决的圈子里。 计数从圆圈中的指定点开始,并沿指定方向围绕圆圈进行。 在跳过指定数量的人之后,处刑下一个人。 对剩下的人重复该过程,从下一个人开始,朝同一方…...
RAG生成中的多文档动态融合及去重加权策略探讨
目录 RAG生成中的多文档动态融合及去重加权策略探讨 一、RAG生成概述 二、多文档动态融合策略 1. 拼接与分段编码 2. 独立编码与后续融合 3. 基于查询的动态加权 三、检索结果的去重与加权策略 1. 去重策略 2. 加权策略 四、实践中的挑战与思考 五、结语 RAG生成中的…...
jdk21使用Vosk实现语音文字转换,免费的语音识别
1.下载vosk的model vosk官网:https://alphacephei.com/vosk/models 我这里使用较小的vosk-model-small-cn-0.22 2.添加相关pom文件 <!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…...
I.MX6ULL 开发板上挂载NTFS格式 U 盘
I.MX6ULL 开发板上挂载NTFS格式 U 盘 挂载失败安装NTFS-3G安装失败成功安装 移植挂载成功卸载U盘 挂载失败 我使用的U盘的格式是NTFS格式的 插入U盘时会有信息 我使用的是闪迪的U盘,大小标称是 32G ,实际能用的只有 28G 左右 可以使用lsblk命令查看磁盘…...
性能测试~
1.什么是性能测试 1.什么是性能 就像这两个车一样,虽然都是代步工具,构造都是一样的,但是路虎的发动机要比捷达好.路虎的百米加速却是比捷达快的,我们就知道路虎的性能要比捷达好 . 那么什么是软件的性能呢?我们分析一下 2.常见的性能测试指标 2.1并发数 并发数是指在同一…...
排查使用RestTemplate远程调用,@RequestBody注解接收不到实体类
做项目学习,使用RestTemplate远程调用,从order订单系统调用pay支付系统,出现使用Request做远程接收。 代码的逻辑很简单,但就是没有接收到实体类 1. 猜想是不是没有序列化和初始化方法? 这个好排查,看Pay和…...
数据库同步中间件PanguSync:如何跳过初始数据直接进行增量同步
某些用户在使用数据库同步中间件PanguSync时说,我不想进行初次的全量同步,我已经源备份还原到目标库了,两边初始数据一样,想跳过初始数据,直接进行增量同步,该怎么设置。 直接上干货,按如下步骤…...
javaWeb Router
一、路由简介 1、什么是路由? - 定义:路由就是根据不同的 URL 地址展示不同的内容或页面。 - 通俗理解:路由就像是一个地图,我们要去不同的地方,需要通过不同的路线进行导航。 2、路由的作用 - 单页应用程序…...
qwen2.5vl技术报告解读
一. 首先qwen2.5vl模型特点 全能文档解析能力 升级文本识别至全场景文档解析,擅长处理多场景、多语种及复杂版式文档(含手写体、表格、图表、化学方程式、乐谱等),实现跨类型文档的精准解析。 跨格式精准目标定位 突破格式限制,大幅提升对象检测、坐标定位与数量统计精度,…...
【Linux】进程的详讲(上)
目录 📖1、冯诺依曼体系结构 📖2、硬件介绍 📖3、内存的重要性 📖4、程序运行的步骤 📖5、QQ聊天时的数据流动 📖6、操作系统 📖7、操作系统的目的 📖8、操作系统是如何…...
高精度除法
除数与被除数都是大整数 代码 #include<bits/stdc.h> using namespace std; typedef long long ll; string a,b; vector<int>dend,sor; bool aisbigger(vector<int>&a,vector<int>&b){if(a.size()!b.size())return a.size()>b.size();for…...
Android面试总结之Glide源码级理解
当你的图片列表在低端机上白屏3秒、高端机因内存浪费导致FPS腰斩时,根源往往藏在Glide的内存分配僵化、磁盘混存、网络加载无优先级三大致命缺陷中。 本文从阿里P8级缓存改造方案出发,结合Glide源码实现动态内存扩容、磁盘冷热分区、智能预加载等黑科技&…...
Pyside6 开发 使用Qt Designer
使用Qt Designer 在Scripts目录下打开pyside6-designer.exe 分别将姓名、年龄、爱好对应的输入框的ObjectName 设置为 uname、uage、ulike 提交按钮Object设置为 btnSubmit 点击保存文件 ,命名为student.ui 将.ui文件编程成.py文件 pyside6-uic student.ui -o st…...
PyQt6实例_批量下载pdf工具_使用pyinstaller与installForge打包成exe文件
目录 前置: 步骤: step one 准备好已开发完毕的项目代码 step two 安装pyinstaller step three 执行pyinstaller pdfdownload.py,获取初始.spec文件 step four 修改.spec文件,将data文件夹加入到打包程序中 step five 增加…...
局域网共享失败?打印机/文件夹共享工具
很多时候,在办公或家庭环境中,我们需要进行打印机和文件夹的共享,以便更高效地协作和处理文件。然而,寻找对应版本的共享设置或是不想花费太多时间去进行复杂的电脑设置,总是让人感到头疼。今天,我要向大家…...
DeepSeek-V3-250324: AI模型新突破,性能超越GPT-4.5
DeepSeek 于 3 月 25 日宣布完成 V3 模型的小版本升级,推出 DeepSeek-V3-250324 版本。新版本在推理能力、代码生成、中文写作及多模态任务上实现显著优化,尤其在数学和代码类评测中得分超越 GPT-4.5,引发行业高度关注。 DeepSeek-V3-250324…...
第R9周:阿尔兹海默症诊断(优化特征选择版)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 1、导入数据2、数据处理2.1 患病占比2.2 相关性分析2.3 年龄与患病探究 3、特征选择4、构建数据集4.1 数据集划分与标准化4.2 构建加载 5、构建模型6…...
19726 星际旅行
19726 星际旅行 ⭐️难度:困难 🌟考点:Dijkstra、省赛、最短路问题、期望、2024 📖 📚 import java.util.*;public class Main {static int N 1005;static ArrayList<Integer>[] g new ArrayList[N]; // …...
DeepSeek大模型应用开发新模式
DeepSeek大模型应用全景技术架构 DeepSeek大模型 VS 主流大模型 DeepSeek大模型系统提示词 VS 主流大模型 DeepSeek大模型迭代版本 DeepSeek专业化模型分类 DeepSeek大模型部署所需显存资源 DeepSeek不同参数模型及应用场景 DeepSeek大模型安装部署技术选型...
代码随想录动态规划05
74.一和零 视频讲解:动态规划之背包问题,装满这个背包最多用多少个物品?| LeetCode:474.一和零_哔哩哔哩_bilibili 代码随想录 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的大小&#…...
Next.js 深度解析:全栈React框架的架构哲学与实践精髓
Next.js 作为 React 生态中最流行的全栈框架,已经超越了简单的SSR工具,发展成为完整的Web开发解决方案。以下从八个维度进行深度剖析: 一、核心架构设计 双引擎驱动模型 页面路由系统:基于文件系统的约定式路由渲染引擎ÿ…...
Node.js Express 处理静态资源
目录 1. 什么是静态资源? 2. 安装 Express 3. 目录结构 4. 创建 server.js 5. 创建 public/index.html 6. 创建 public/style.css 7. 创建 public/script.js 8. 运行服务器 9. 结语 1. 什么是静态资源? 静态资源指的是 HTML、CSS、JavaScript、…...
2025企业级项目设计三叉戟:权限控制+错误监控+工程化提效实战指南
一、权限系统设计:动态路由与按钮级控制的终极方案 1. 权限系统架构设计痛点 路由权限滞后:传统方案需页面加载后动态计算路由表,导致首屏白屏时间增加30%按钮颗粒度不足:基于角色的权限控制(RBAC)无法满…...
DeepSeek-V3新版本DeepSeek-V3-0324
中国人工智能初创公司深度求索(DeepSeek)2025年3月24日深夜低调上线了DeepSeek-V3的新版本DeepSeek-V3-0324,参数量为6850亿,在代码、数学、推理等多个方面的能力再次显著提升,甚至代码能力追平美国Anthropic公司大模型…...
108回回目设计
由于108回完整目录篇幅极长,我将以分卷缩略核心回目详解形式呈现,既保证完整性,又避免信息过载。以下是凝练后的完整框架与部分代表性回目: 第一卷:京口草鞋摊的野望(1-36回) 核心矛盾…...
探索:如何构建一个自我的AI辅助的开发环境?
构建支持AI的开发辅助环境并实现全流程自动化,需要整合开发工具链、AI模型服务和自动化流水线。以下是分步实施指南,包含关键技术栈和架构设计: 一、开发环境基础架构 1. 工具链集成平台 #mermaid-svg-RFSaibQJwVEcW9fT {font-family:"…...
国产RISC-V车规芯片当前现状分析——从市场与技术角度出发
摘要 随着汽车产业的智能化、电动化转型加速,车规级芯片的战略地位日益凸显。RISC-V指令集凭借其开源、灵活、低功耗等优势,成为国产车规芯片的重要发展方向。本文从市场与技术两个维度出发,深入分析国产RISC-V车规芯片的现状。通过梳理国内…...
华为eNSP-配置静态路由与静态路由备份
一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时,需要网络管理人员手工修改静态路由信息。相比于动态路由协议,静态路由无需频繁地交换各自的路由表,配置简单,比较适合…...
数据分析中,文件解析库解析内容样式调整(openpyxl 、tabulate)
CSV文件:使用Python标准库中的csv模块,通过简单的文本解析来读取数据。 Excel文件:使用专门的库(如openpyxl、xlrd)来解析复杂的文件格式,或者使用pandas库来简化读取过程。 openpyxl openpyxl 是一个 Pyt…...
时尚界正在试图用AI,创造更多冲击力
数字艺术正以深度融合的方式,在时尚、游戏、影视等行业实现跨界合作,催生了多样化的商业模式,为创作者和品牌带来更多机会,数字艺术更是突破了传统艺术的限制,以趣味触达用户,尤其吸引了年轻一代的消费群体…...
