找到重複的數字(龜兔賽跑演算法)

2021-10-03 08:34:00 字數 1123 閱讀 5136

假設有乙個陣列,陣列裡有n+1個數,每個數範圍是1-n,且只有乙個重複數字,找到這個重複數字並返回如:

[1,2,3,2,4]有5個數,每個數範圍為1-4

現在的任務是找到2這個數字

普通方法1:可以先排序,遍歷一次,然後對比兩個元素是否相同

#python

nums.sort(

)for num in nums:

if num==num

return num

//c++

#include sort(nums.begin(),nums.end())

for(int i=1;i這個方法很簡單易懂,但是如果要求時間效率再高點呢

普通方法2:用雜湊表(字典或者集合),犧牲記憶體減少排序的時間

#python

result=

for num in nums

if num in result:

return num

result[nums[i]]=

true

//c++

#include mapresult;

for(int i=1;i歸兔賽跑法:定義兩個指標,乙個每次向前兩步,乙個每次向前一步,如果陣列裡有重複的數字,這兩個指標一定會相遇,相遇後,快的指標重置到陣列起點,兩個指標在同時按步數為1的方法前進,再次相遇的數字即為重複數字

#python

tortoise=nums[0]

hare=nums[0]

while

true

: tortoise=nums[tortoise]

hare=nums[nums[hare]

]if tortoise==hare:

break

ptr1=nums[0]

ptr2=tortoise

while

true

: ptr1=nums[ptr1]

ptr2=nums[ptr2]

if ptr1==ptr2:

return ptr1

參考鏈結

龜兔賽跑演算法(Floyd判圈演算法)

參考資料 1.維基百科 判圈演算法 redirect no 2.floyd判圈演算法 floyd cycle detection algorithm 又稱龜兔賽跑演算法 tortoise and hare algorithm 該演算法由美國科學家羅伯特 弗洛伊德發明。可以在有限狀態機 迭代函式或者鍊...

Floyd判圈演算法(龜兔賽跑演算法)

一 演算法簡述 floyd判圈演算法 floyd cycle detection algorithm 又稱龜兔賽跑演算法 tortoise and hare algorithm 是乙個可以在有限狀態機 迭代函式或者鍊錶上判斷是否存在環,以及判斷環的起點與長度的演算法。二 基本思路 在某種關係下,頂點...

C語言 解決龜兔賽跑的問題

pta基礎程式設計題目集7 22 龜兔賽跑這一問題可能有很多解答方法,例如結合數學影象之類的經典方法,除此之外,我還想到了一種方法。下面來看解析。題目簡介 烏龜與兔子進行賽跑,跑場是乙個矩型跑道,跑道邊可以隨地進行休息。烏龜每分鐘可以前進3公尺,兔子每分鐘前進9公尺 兔子嫌烏龜跑得慢,覺得肯定能跑贏...