陣列查詢重複數 LeetCode

2021-10-06 12:00:00 字數 3297 閱讀 8301

--------------------------------學無止境,道亦有道-----------------------------
給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。

不能更改原陣列(假設陣列是唯讀的)。

只能使用額外的 o(1) 的空間。(僅可開闢一次記憶體,不能使用遞迴方式)

時間複雜度小於 o(n2) 。(兩次迴圈)

陣列中只有乙個重複的數字,但它可能不止重複出現一次。

ps:即查詢陣列中的重複數。

示例 1:

輸入: [1,3,4,2,2]

輸出: 2

示例 2:

輸入: [3,1,3,4,2]

輸出: 3

方法一:逐個選取

用兩個指標分別比較指向的數字,相同輸出,不同移動指標。

如上圖中所示,比較紅色與綠色指標所指向的value是否相等,相等返回紅色或綠色指標的value。若不相等,則先移動綠色指標,其步長為1。當綠色指標移動到陣列末端時,紅色指標步進1。綠色指標則移動到紅色指標index+1的位置。

以此類推,直到紅色指標移動到 nums.length-1 或者紅綠兩指標所指向的value相等時停止。

方法二:判環方式

將不同資料想成乙個節點,按照 nums[i] 的陣列原有順序進行連線,以示例一([1,3,4,2,2])為例:

在 示例一 中,起點與終點都是 「2 」 所以返回重複值——2;

同樣,在示例二([3,1,3,4,2])中也可以將陣列轉化為圖來觀察:

由圖可以看出,環出現在了 1-3 間,起點和終點為3,所以返回重複值——3。

ps:因為方法很簡單就不對**解釋了

public

intfindduplicate1

(int

nums)}}

system.out.

println

("找不到重複數,返回0");

return0;

}

優缺點:簡單易懂,實現起來方便,但消耗系統資源較大。

定義快指標——rabbit(兔子),慢指標——turtle(烏龜),兩者均從 index = 0 開始跑。

烏龜跑自己的值,兔子跑自己值的索引,即為烏龜跑了兩次。開始時 turtle 的值為0;

第一次迴圈結果:

比較值後不相等繼續跑:

第二次迴圈結果:

以此類推,在第五次迴圈後相遇,則把烏龜放到0處兔子繼續跑,但同步跑,每次步長都為1。

烏龜和兔子均跑自己的值:

經過兩次後找到相同數:

;//相遇後,兔子從相遇點出發,烏龜從起點出發

turtle =0;

while

(rabbit != turtle)

return rabbit;

}空間複雜度是對乙個演算法在執行過程中臨時占用(虛擬機器中)儲存空間大小的量度,記做s(n)=o(f(n))。

如當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1);當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為o(log2n);當乙個演算法的空間複雜度與n成線性比例關係時,可表示為o(n).

時間複雜度又稱為時間複雜度,乙個演算法的時間複雜度不單單是程式執行時間的值,而是乙個函式,它定性描述該演算法的執行時間。

以下內容整理自: mars93的文章——o(1), o(n), o(logn), o(nlogn)

o(n),就代表資料量增大幾倍,耗時也增大幾倍。比如常見的遍歷演算法

o(n2),就代表資料量增大n倍時,耗時增大n的平方倍,這是比線性更高的時間複雜度。比如氣泡排序,就是典型的o(n2)的演算法,對n個數排序,需要掃瞄n×n次。

o(logn),就代表當資料增大n倍時,耗時增大logn倍(以2為底的對數函式,比如,當資料增大256倍時,耗時只增大8倍)。比如二分查詢(每找一次排除一半的可能,256個資料中查詢只要找8次就可以找到目標)

o(nlogn),就是n乘以logn,當資料增大256倍時,耗時增大256*8=2048倍。這個複雜度高於線性低於平方。歸併排序就是o(nlogn)的時間複雜度。

o(1),就是最低的時空複雜度, 耗時或空間 與 輸入資料大小 無關,無論輸入資料增大多少倍,耗時/耗空間都不變。比如雜湊演算法,無論資料規模多大,都可以在一次計算後找到目標。

陣列中重複數字 leetcode

在乙個長度為n的陣列裡的所有數字都在0 n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的數字,那麼對應的輸出是重複的數字2或者3。上來這道題的思路就是暴力解決,如何暴力解決這個問題呢。思路 直接雙重...

leetcode刷題 陣列重複數字

題目描述 在乙個長度為 n 的陣列裡的所有數字都在 0 到 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字 input output 2 includevoid swap int nums,int i,int j int...

LeetCode 尋找重複數

給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重...