LeetCode 尋找重複數

2021-10-10 05:55:00 字數 2690 閱讀 5360

題目:

給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。

假設只有乙個重複的整數,找出這個重複的數。

示例 1:

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

輸出: 2

示例 2:

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

輸出: 3

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

只能使用額外的 o(1) 的空間。

時間複雜度小於 o(n2) 。

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

題意分析:將1到n的數字放入到長度為n+1的陣列中,最好情況,假如將1到n的陣列依次放入數

組中,則陣列最後乙個槽位就會為空,要填滿整個陣列則要從1到n的數字中選乙個填

入到最後。所以必然會有重複的數字出現。

最容易想到的解法1:

暴力解法

private

intfindduplicate

(int

nums)}}

return-1

;}

最容易想到的解法2:利用set集合不能儲存重複元素的特性。

private

intfindduplicate

(int

nums)

}return-1

;}

以上兩種解法,第一種時間複雜度為o(n^2),第二種,空間複雜度為o(n).均不滿足題目要

求。不是最優解。題中的條件我們沒有充分的利用,

題目:給定乙個包含n + 1 個整數的陣列 nums,其數字都在1 到 n 之間(包括 1 和 n),可

知至少存在乙個重複的整數。

將1到n的數字放入到長度為n+1的陣列中,則存入的數字均在陣列下標範圍內。我們可

以將其看著是鍊錶來處理。

例如:

以陣列 [1,3,4,2,2] 為例,將陣列下標 n 和數 nums[n] 建立乙個對映關係 f(n),n->f(n) 為:

0->1

1->3

2->4

3->2

4->2

從下標為 0 開始,根據 f(n) 計算出對應槽位的值,以這個值為新的下標,再用這個函式

計算,以此類推產生乙個類似鍊錶一樣的序列。

0 => 1 => 3 => 2 => 4 => 2 => 4 => 2 =>。。。。。。

發現 2 => 4 是乙個迴圈,畫圖為:

分析可得,陣列中如果有重複的數,那麼就會產生多對一的對映關係,這樣形成的鍊錶

就一定會有環。

陣列中有重複的數字 == 鍊錶中存在環

陣列中的重複整數 == 鍊錶中環的入口

單鏈表存在環雙指標解法:

public

intfindduplicate

(int

nums)

int begin=0;

int meet= slow;

//相遇後慢指標繼續走,新起乙個指標從煉表頭開始走,當兩者相遇即為鍊錶的入口。

while

(begin != meet)

return meet;

}

求證:相遇後慢指標繼續走,新起乙個指標從煉表頭開始走,當兩者相遇即為鍊錶的入口。

為什麼兩者相遇就是鍊錶的入口?

設l2 為快指標走的距離

設煉表的起點到環的入口距離為 f

設相遇點到環的入口點的距離為 a

設環的入口點到相遇點的距離為 b

設環的周長為c

設慢指標在環上跑了x個整圓距離

設快指標在環上跑了y個整圓距離

假如:f = a, 則一定會在環入口相遇。

f = a + nc , 慢指標向前a 加n個環的周長,則也一定相遇。

如果f < a,則當begin指標進入環後慢指標還未到達入口,由於兩者不長均為1.所以如果

f < a則永遠不會相遇。所以有f >= a。

所以需要求證:f = a + nc

則有:l1 = f + xc + b

l2 = 2l1 = f + yc + b

相減則有:

l1 = yc - xc = f + xc + b

則有: f = yc - xc - xc - b

有:b = c - a

所以:f = yc - xc - xc - c + a

f = (y - 2x - 1)c + a

(y - 2x - 1)為常數。

則f = a + nc 得證。

LeetCode 尋找重複數

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

LeetCode 尋找重複數

給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...

leetcode 尋找重複數

給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...