287 尋找重複數 力扣(LeetCode)

2021-10-02 14:19:35 字數 1649 閱讀 4717

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