龜兔賽跑算法(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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/87039.shtml
英文地址,請注明出處:http://en.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;同時遵守合法使用的基本原則。 一、…