龟兔赛跑算法(Floyd‘s Cycle-Finding Algorithm)寻找重复数

龟兔赛跑算法(Floyd’s Cycle-Finding Algorithm)寻找重复数

问题描述

给定一个长度为 N+1 的数组 nums,其中每个元素的值都在 [1, N] 范围内。根据鸽巢原理,至少有一个数字是重复的。请找出这个重复的数字。

要求:

  • 时间复杂度 O(N)
  • 空间复杂度 O(1)(不能使用哈希表等额外存储)

算法思路(龟兔赛跑法)

我们可以将数组视为一个链表,其中 nums[i] 表示 i → nums[i] 的边。由于存在重复数字,这个链表必然存在一个,而环的入口就是重复的数字。

步骤:

  1. 快慢指针找相遇点(判断是否有环):

    • 慢指针 slow 每次走 1 步:slow = nums[slow]
    • 快指针 fast 每次走 2 步:fast = nums[nums[fast]]
    • 直到 slow == fast,说明两者在环内相遇。
  2. 找环的入口(即重复的数字)

    • fast 重置到起点 0
    • slowfast 都每次走 1 步,直到再次相遇,相遇点就是重复的数字。

代码实现

public int findDuplicate(int[] nums) {int slow = 0;int fast = 0;// 第一阶段:快慢指针找相遇点do {slow = nums[slow];          // 慢指针走 1 步fast = nums[nums[fast]];     // 快指针走 2 步} while (slow != fast);// 第二阶段:找环的入口(重复数字)fast = 0;while (slow != fast) {slow = nums[slow];fast = nums[fast];}return slow;  // 或 fast,此时它们相等
}

为什么这个算法有效?

  1. 第一阶段(找相遇点)

    • 假设环的长度为 L,环外长度为 F
    • slow 进入环时,fast 已经在环内,且距离 slowd0 ≤ d < L)。
    • 由于 fast 每次比 slow 多走 1 步,它们会在 L - d 步后相遇。
  2. 第二阶段(找环入口)

    • slowfast 在环内相遇时,slow 走了 F + a 步(a 是环内走的步数)。
    • fast 走了 F + a + kL 步(k 是整数,因为 fast 可能绕环多圈)。
    • 由于 fast 速度是 slow2 倍:
      [
      2(F + a) = F + a + kL \implies F + a = kL \implies F = kL - a
      ]
    • 这意味着,从起点走 F 步,刚好到达环的入口(即重复数字)。

示例

输入: nums = [1, 3, 4, 2, 2]
步骤:

  1. 第一阶段
    • slow = 0 → 1 → 3 → 2 → 4 → 2 → 4 → ...
    • fast = 0 → 1 → 3 → 2 → 4 → 2 → 4 → ...
    • 它们在 24 相遇(具体取决于实现)。
  2. 第二阶段
    • fast 重置到 0,然后 slowfast 都每次走 1 步:
      • fast = 0 → 1 → 3 → 2
      • slow = 4 → 2
    • 它们在 2 相遇,因此 2 是重复数字。

复杂度分析

  • 时间复杂度O(N)(最多遍历 2N 次)。
  • 空间复杂度O(1)(仅用两个指针)。

总结

龟兔赛跑算法是一种高效的链表环检测方法,适用于:

  • 检测链表是否有环。
  • 找出数组中的重复数字(数组值在 [1, N] 范围内)。
  • 不修改原数组,且满足 O(1) 额外空间。

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

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

相关文章

紫光展锐T8300以创新音频技术重塑感知世界

数字化时代&#xff0c;从语音通话到智能交互&#xff0c;从聆听音乐到创作Vlog&#xff0c;声音已成为隐形的基础措施。日益发展的音频技术正在重构用户感知世界的方式&#xff0c;重塑用户的听觉体验。 T8300是紫光展锐专为全球主流用户打造的5G SoC&#xff0c;采用了紫光展…

写作词汇积累(A):颇有微词、微妙(“微”字的学习理解)

一、颇有微词 1、基本介绍 【颇有微词】指对某人或某事有轻微的批评、不满或不同意见&#xff0c;但表达得含蓄委婉 【颇】表示程度较深&#xff0c;【微词】表示隐晦的批评 【微】表示隐晦的、不直白的&#xff0c;强调批评的委婉性 2、使用实例 1、尽管公司的新考勤制度…

flowable工作流的学习demo

1.spring 部署流程 删除部署 查看历史信息 加载一个默认的配置文件 里面包含用户名和数据库信息 加载自定义的配置文件 flowable.cfg.xml <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance…

XCTF-misc-can_has_stdio?

下载得到一个文件 ┌──(kali㉿kali)-[~] └─$ file misc50 misc50: ASCII text, with very long lines (536)┌──(kali㉿kali)-[~] └─$ cat misc50 …

【编译工具】(自动化)AI 赋能的自动化测试工具:如何让测试效率提升 500% 并实现智能质检?

#『编程工具』提升效率征文挑战赛# 目录 引言&#xff1a;AI 如何重塑自动化测试格局 一、新一代 AI 测试工具核心能力解析 二、实战演示&#xff1a;Testim 智能测试平台 &#xff08;1&#xff09;智能录制测试流程 ① 步骤演示 ② AI 元素定位原理 &#xff08…

毛纪逆向分析

文章目录 毛纪逆向分析前言知识系统整体架构概述模块分析模块0模块1模块2模块3模块4模块5总结毛纪逆向分析 对爬虫、逆向感兴趣的同学可以查看文章,一对一小班教学(系统理论和实战教程)、提供接单兼职渠道:https://blog.csdn.net/weixin_35770067/article/details/142514698…

【力扣 简单 C】141. 环形链表

目录 题目 解法一&#xff1a;哈希 解法二&#xff1a;快慢指针 题目 解法一&#xff1a;哈希 struct node {struct ListNode* val;struct node* next; };struct hashSet {struct node** bucket;int size; };struct hashSet* hashSetInit(int size) {struct hashSet* hashS…

Eureka 服务注册与发现原理和使用

1.Eureka 基础概念 Eureka 是 Netflix 开发的服务注册与发现组件&#xff0c;是 Spring Cloud 微服务架构中的核心模块&#xff0c;用于解决微服务间的自动发现与通信问题。其核心功能包括&#xff1a; 服务注册&#xff1a;服务实例将自身信息&#xff08;IP、端口、健康状态等…

create_react_agent + MCP tools

文章目录 MCP tools 调用结果输出MCP Tool 内容成功返回失败返回 普通工具调用 https://blog.csdn.net/2401_89025022/article/details/148629902 MCP tools 调用 import time import asyncio import json from langgraph.prebuilt import create_react_agent from langch…

提示词Prompts(1)

摘要&#xff1a; 本文介绍了langchain.prompts中基础的提示词模板的用法&#xff0c;包括基础的文本模板、对话模板、小样本模板、以及主要两种样本选择器的用法。 文章目录 1. prompts介绍&#xff1f;2. 提示词模板体系 Prompt Templates2.1 基础文本模板 PromptTemplate2.2…

如何在 Elementary OS 上安装最新版本的 VirtualBox

Elementary OS 是一个基于 Ubuntu Linux 的发行版&#xff0c;它易于使用&#xff0c;对初学者友好&#xff0c;并且在用户中非常受欢迎。如果你是 Elementary OS 的用户&#xff0c;并且想在上面虚拟运行和探索其他操作系统&#xff0c;那么 Oracle VirtualBox 是一个非常不错…

uni-app项目loading显示方案

前情 uni-app是我比较喜欢的跨平台框架&#xff0c;它能开发小程序/H5/APP(安卓/iOS)&#xff0c;重要的是对前端开发友好&#xff0c;自带的IDE可视化的运行和打包也让开发体验也非常棒&#xff0c;公司项目就是主推uni-app&#xff0c;为了用户体验对于耗时操作&#xff0c;…

【Android笔记】记一次 CMake 构建 Filament Android 库的完整排错过程(安卓交叉编译、CMake、Ninja)

写在前面的话&#xff0c;为了保持Sceneform-EQR始终是采用最新的filament&#xff0c;每隔一段时间我都会编译filament&#xff0c;并根据新增内容完善Sceneform-EQR。 现由于更换电脑&#xff0c;环境需重新配置。简单记录下编译出错和解决方式。 Sceneform-EQR 是EQ对谷歌“…

ARM 单片机定义变量绝对地址方法

在ARM单片机中&#xff0c;定义变量到绝对地址通常有以下几种方法&#xff08;以Keil MDK为例&#xff0c;其他工具链原理类似&#xff09;&#xff1a; 方法1&#xff1a;使用指针强制转换&#xff08;通用&#xff09; 直接通过指针访问指定地址&#xff1a; define REGIS…

为何AI推理正推动云计算从集中式向分布式转型

作者简介&#xff1a;Vineeth Varughese是Akamai亚太及日本地区的云产品市场负责人&#xff0c;在云计算、人工智能&#xff08;AI&#xff09;及市场进入策略&#xff08;GTM&#xff09;领域拥有丰富经验。 传统云平台在利用海量数据训练AI模型方面表现出色&#xff0c;但随着…

ar 导航导览技术如何实现的?室内外融合定位与ar渲染技术深度解析

本文面向&#xff1a;移动开发工程师、AR技术研究者、室内外导航系统产品经理&#xff0c;旨在提供核心问题的参考方案&#xff1a;如何实现室内外无缝切换的精准定位&#xff08;GPS蓝牙Beacon&#xff09;虚拟导航路径与实景画面的实时叠加原理。 如需获取ar导航导航技术解决…

电路问题处理:SGMII链路中的AC耦合电容摆放位置

SGMII链路中的AC耦合电容摆放位置 目前是有个板子&#xff0c;其上分别有fpga&#xff0c;fpga的gtx口出sgmii千兆以太网链路&#xff0c;通过高速连接器互联&#xff0c; 通常高速差分链路的AC耦合电容放在靠近接收端位置&#xff0c;如果在同一个板内的话没啥疑惑的直接靠近…

激光雷达 + 视觉相机:高精度位姿测量方案详解

激光雷达 视觉相机&#xff1a;高精度位姿测量方案详解 引言 在航天器交会对接、自动驾驶、机器人导航等领域&#xff0c;位姿&#xff08;位置姿态&#xff09;测量的精度和鲁棒性至关重要。单一的传感器&#xff08;如激光雷达或视觉相机&#xff09;往往难以满足复杂场景的…

【整数递增加法拆分】2022-4-11

缘由整数拆分问题&#xff0c;但是怎么输出这个数位最多。-编程语言-CSDN问答 void 整数递增加法拆分() {//缘由https://ask.csdn.net/questions/7687667?spm1005.2025.3001.5141int n 0, c 1, f c, t n;string sc "";cin >> n; t n;while (t){if (t &…

Hashcat使用教程:快速上手密码恢复工具

在信息安全领域&#xff0c;密码破解是不可或缺的一环。而 Hashcat&#xff0c;作为当前最强大的密码恢复工具之一&#xff0c;因其高效的性能与灵活的配置广受好评。本文将介绍 Hashcat 的基础用法&#xff0c;帮助新手快速上手&#xff0c;同时遵守合法使用的基本原则。 一、…