龟兔赛跑算法

一、题目

给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n1 的范围内,其中 n≥1。

请找出数组中任意一个重复的数。

样例
给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。

二、解析

解决这个问题的一种有效方法是使用快慢指针,也称为龟兔赛跑算法(Floyd's Cycle Detection Algorithm)。该算法的基本思想是在一个循环链表中,快指针和慢指针分别以不同的速度移动,如果存在环,则两者最终会相遇。

在这个问题中,可以将数组视为一个链表,数组中的元素值作为下一个节点的索引,构成一个链表。因为题目保证了数组中的元素值在 1 到 n 的范围内,所以数组中不存在负数,也不存在索引超出数组范围的情况。

原理:

当我们把数组中的元素看作链表中的节点时,题目要求找到数组中的任意一个重复数,实际上就是在链表中找到环的入口点。快慢指针算法的核心思想是利用两个不同速度的指针,如果存在环,这两个指针最终会相遇。

下面是算法的基本思路:

  1. 初始化:使用两个指针,一个慢指针 slow 和一个快指针 fast,初始时都指向数组的第一个元素 nums[0]

  2. 寻找相遇点:快指针每次前进两步,慢指针每次前进一步,直到两者相遇。相遇时,说明链表中存在环。

  3. 重置一个指针:将其中一个指针(例如慢指针)重置到数组的第一个元素 nums[0],而另一个指针保持在相遇点。

  4. 寻找环的入口点:两个指针再以相同速度前进,直到它们再次相遇。相遇点即为环的入口点,也即重复的数。

这个原理的关键在于,当两个指针相遇时,说明链表中存在环。在寻找环的入口点时,将一个指针重置到链表头,然后两个指针以相同的速度前进,它们再次相遇的点就是环的入口点。在这个问题中,环的入口点对应于数组中的重复数。

这个算法的时间复杂度为 O(n),其中 n 是数组的长度。算法的空间复杂度为 O(1),因为只使用了常数额外的空间。

下面是用C语言实现的代码:

#include <stdio.h>int findDuplicate(int* nums, int numsSize) {// 初始化快慢指针int slow = nums[0];int fast = nums[0];// 寻找相遇点do {slow = nums[slow];fast = nums[nums[fast]];} while (slow != fast);// 重置其中一个指针,并寻找环的入口点——这里可以想一想为什么:Aslow = nums[0];while (slow != fast) {slow = nums[slow];fast = nums[fast];}// 返回环的入口点,即重复的数return slow;
}int main() {// 示例用法int nums[] = {1, 3, 4, 2, 2};int numsSize = sizeof(nums) / sizeof(nums[0]);int duplicate = findDuplicate(nums, numsSize);printf("Duplicate: %d\n", duplicate);return 0;
}

 A:让我们来解释一下为什么这个过程能找到环的入口点:

  1. 首次相遇点:当快指针和慢指针首次相遇时,它们分别走过的步数之间存在关系,快指针走过的步数是慢指针的两倍。假设两者相遇时,慢指针走了 k 步,则快指针走了 2k 步,其中 k 是环的长度的整数倍。

  2. 重置指针位置:将慢指针重置到数组的第一个元素 nums[0],保持快指针在相遇点不动。

  3. 再次相遇:此时,慢指针从数组头部开始,而快指针还停留在相遇点。它们以相同的速度前进,当慢指针再次走了 k 步时,快指针走了 2k 步,即正好走完了环的若干圈,同时再次相遇。

  4. 相遇点即为入口点:再次相遇的点就是环的入口点。这是因为在第一次相遇后,慢指针已经在环内走了若干圈,而重置后再次相遇时,慢指针还需走若干圈才能达到入口点,而快指针已经在环内等待,因此它们在入口点相遇。

这个过程的本质是根据快慢指针相遇时,快指针已经走过的步数是慢指针的两倍的特性,找到环的入口点。这个算法的关键在于数学上的推理,而实际上这种方法是基于龟兔赛跑算法的原理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/692128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot图书管理系统

介绍 图书管理系统助力于图书馆中图书的管理&#xff0c;功能包含图书管理、借阅、归还&#xff0c;三块业务的解决方案&#xff0c;可对图书进行查询、查询图书剩余数量及借阅记录和状态、监控数量不足的图书。 使用技术 SpringBootMyBatisThymeleafMySQL 项目结构 业务流…

五种多目标优化算法(MOAHA、MOGWO、NSWOA、MOPSO、NSGA2)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOAHA 1.2MOGWO 1.3NSWOA 1.4MOPSO 1.5NSGA2 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff…

体验一下UE5.3的Skeletal Editor

UE5.3中增加了蒙皮网格骨架编辑工具&#xff0c;用户无需导出Fbx就可以直接编辑蒙皮网格&#xff0c;支持修改绑定姿势的骨骼位置、修改蒙皮权重、对已蒙皮多边形进行编辑以及对蒙皮网格减免等操作&#xff0c;就来体验一下。 1.加载插件 要使用Skeletal Editor功能&#xff…

SpringBoot中使用PageHelper插件实现Mybatis分页

场景 SpringBoot中整合Mybatis时一般添加的依赖为 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.1</version></dependency> 如果要实现分页查…

PostgreSQL里实现计算多个数字的排列组合

在进行排列组合的时候&#xff0c;每一次需要知道是否有重复的值&#xff0c;并过滤出已经排列过的值。这个可以创建支持可变参数的函数来实现。下边的函数用到了聚合判断&#xff0c;并且可变参数使用variadic标记的数组。 postgres<16.1>(ConnAs[postgres]:PID[188277…

基于shp数据制作3DTiles建筑白膜

经纬管网建模系统MagicPipe3D&#xff0c;本地离线参数化构建地下管网、建筑三维模型&#xff0c;输出标准3DTiles服务、Obj模型等格式&#xff0c;支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎下载试用&#xff1a;http://www.magic3d.…

抖音小店怎么做?不会做抖音小店怎么办?

大家好&#xff0c;我是电商花花。 如果想做抖音小店但是又不会做抖音小店的朋友可要看过来&#xff0c;现在抖音小店无货源发展的这么好&#xff0c;市场这么大&#xff0c;如果还不会做抖店的可要看过来了。 问什么别人一做就会爆单&#xff0c;就能找到商家&#xff0c;而…

二百二十四、Kettle——曲线实现从Hive插入更新到ClickHouse(分区字段是month或year)

一、目的 对于以month、year为分区字段的数据&#xff0c;不是像day字段分区那样每天增量插入更新即可&#xff0c;而是要以部分字段查询、部分字段更新&#xff0c;但是ClickHouse数据库并不适合更新操作&#xff0c;直接使用Kettle的插入更新控件会导致问题&#xff0c;必须…

基于python+django+vue.js开发的社区养老管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;老人管理、护工管理、亲属管理、病史管理、房间管理、活动管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.co…

Java项目,营销抽奖系统设计实现

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 项目&#xff1a;https://gaga.plus 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 大家好&#xff0c;我是技术UP主&#xff0c;小傅哥。 经过这个假期的嘎嘎卷&#x1f9e8;…

软件实际应用实例分享,门诊电子处方模板制作教程,中西医诊所病历开单系统教程

软件实际应用实例分享&#xff0c;门诊电子处方模板制作教程&#xff0c;中西医诊所病历开单系统教程 一、前言 以下软件教程以 佳易王诊所电子处方软件V17.3为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、在开电子处方的时候&#xff0c…

算法-二叉树相关

判断二叉树是否是完全二叉树 思路&#xff1a;层次遍历&#xff0c;如果之前某个节点叶子节点为空&#xff0c;队列后续的所有节点的左右节点都不能非空&#xff0c;并且如果节点左节点为null但是右节点不为null该二叉树一定不是满二叉树 public static boolean isCBT1(Node …

沁恒CH32V30X学习笔记07---多功能按键框架使用

多功能按键框架使用 参考开源框架: GitHub - 0x1abin/MultiButton: Button driver for embedded system 框架使用说明: ch32gpio基本驱动 https://blog.csdn.net/u010261063/article/details/136157718 MultiButton 简介 MultiButton 是一个小巧简单易用的事件驱动型按…

python数据类型-字典

1 字典定义 1&#xff09;字典中的元素时一个个键值对&#xff0c;键和值之间用冒号&#xff1a;分隔&#xff0c;键值对元素之间用逗号分隔&#xff0c;格式&#xff1a;d {key1 : value1, key2 : value2 } 2&#xff09;字典中的键是唯一的&#xff0c;值可以重复 注**&…

Java 中是否存在内存溢出、内存泄漏?如何解决?举例说明(企业真题)

Java 中是否存在内存溢出、内存泄漏&#xff1f;如何解决&#xff1f;举例说明 解答&#xff1a; 存在&#xff01; 在程序执行的过程中&#xff0c;明明这是不再使用的内存空间了&#xff0c;但是jvm通过相关的算法判定以后不认为这是垃圾&#xff0c;那么就构成了内存泄漏…

相机图像质量研究(40)常见问题总结:显示器对成像的影响--画面泛白

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

阿里云幻兽帕鲁Windows 服务器怎么下载存档?

阿里云幻兽帕鲁Windows 服务器怎么下载存档&#xff1f;通过远程连接window服务器桌面的方式。 远程连接到阿里云的 Windows 服务器后&#xff0c;可以将压缩后的存档文件&#xff0c;拖动到 workbench\Download 目录后&#xff0c;就会触发浏览器的文件下载&#xff0c;然后将…

CSP-J 2023 复赛第2题:公路 ← 贪心算法

【题目来源】https://www.luogu.com.cn/problem/P9749https://www.acwing.com/problem/content/5311/【题目描述】 小苞准备开着车沿着公路自驾。 公路上一共有 n 个站点&#xff0c;编号为从 1 到 n。 其中站点 i 与站点 i1 的距离为 vi 公里。 公路上每个站点都可以加油&…

[职场] 预算员简历模板 #媒体#微信#笔记

预算员简历模板 个人简历 基本资料 姓名&#xff1a;蓝小小 性别&#xff1a;男 年龄&#xff1a;28岁 籍贯&#xff1a;重庆 现居地址&#xff1a;重庆渝中区 政治面貌&#xff1a;中共党员 婚姻状况&#xff1a;已婚 求职意向 意向岗位&#xff1a;预算员 期望薪…

notepad++的下载与使用

1.进入官网下载 https://notepad-plus-plus.org/ 点击下载即可 2.选择中文简体 3.建议安装在D盘 其余步骤按照指示就行 4.安装后这几个是必选的 设置完成后就可以写中文了 以此为例 结果为