題目:
給定乙個包含 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說明 不能更改原陣列 假設陣列是唯讀的 只能使用...