給定乙個包含 n + 1 個整數的陣列 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。
示例 1:
輸入:[1,3,4,2,2]
輸出:2
示例 2:
輸入:[3,1,3,4,2]輸出:3說明:
不能更改原陣列(假設陣列是唯讀的)。
只能使用額外的 o(1) 的空間。
時間複雜度小於 o(n
2) 。
陣列中只有乙個重複的數字,但它可能不止重複出現一次。
如果沒有陣列只是唯讀的,空間只能是o(1)的限制,常用的方法有排序,然後判斷相鄰元素是否存在相等的(違背了陣列是唯讀的原則)。或者用乙個雜湊表記錄出現的數字,再次出現時,表明是重複元素(違背了空間只能是唯讀的原則)。除此之外,我沒有想到空間為o(1)或陣列唯讀的演算法。
參考題解,二分查詢法。
這個二分查詢法不同於傳統的二分查詢,它的時間複雜度為o(n
logn
)o(nlogn)
o(nlog
n),因為每次二分前,需掃瞄一次陣列,統計不大於當前猜測值元素mid的元素的個數,如果個數大於猜測元素,表明重複元素位於[big, mid]區間,否則,重複元素位於[mid + 1, end]區間。
/*
二分法查詢
時間複雜度為:o(nlogn)
空間複雜度為:o(1)
*/class
solution}if
(cnt > mid)
else
}return left;}}
;
官方題解提供的floyd判圈法。將原始問題轉換為求鍊錶的環的起點。
根據只有乙個重複數字,且n+1個數字處於[1,n]的範圍內,我們很容易構造這樣乙個鍊錶。
鍊錶的每乙個節點nod
e1
node_1
node1
為nums[0],後乙個節點為nod
e2=n
ums[
node
1node_2 = nums[node_1
node2
=num
s[no
de1
,則每i個節點為num
s[no
dei−
1]
nums[node_]
nums[n
odei
−1]
,因為nums陣列中存在重複元素,必定會形成環。重複的元素即為環的起點
/*
快慢指標
時間複雜度為:o(n)
空間複雜度為:o(1)
*/class
solution
//找到環的起點,即重複的元素
slow = nums[0]
;while
(slow != fast)
return slow;}}
;
尋找重複數(力扣第287題)
給定乙個包含n 1個整數的陣列 nums,其數字都在1到n之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用額外的 o ...
力扣 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。不能更改原陣列 假設陣列是唯讀的 只能使用額外的 o 1 的空間。時間複雜度小於 o n2 陣列中只有乙個重複的數字,但它可能不止重複出...
287 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2 示例 2 輸入 3,1,3,4,2 輸出 3 說明 不能更改原陣列 假設陣列是唯讀的 只能...