LeetCode 287 尋找重複數

2022-01-10 13:34:47 字數 1237 閱讀 4899

特別感謝leetcode大佬陳牧遠的科普知識

給定乙個包含 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) 。

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

解析:

【筆記】這道題(據說)花費了計算機科學界的傳奇人物don knuth24小時才解出來。並且我只見過乙個人(注:keith amling)用更短時間解出此題。

快慢指標,乙個時間複雜度為o(n)的演算法。

舉個例子:nums = [2,5, 9 ,6,9,3,8, 9 ,7,1],構造成煉表就是:2->[9]->1->5->3->6->8->7->[9],也就是在[9]處迴圈。

對「其四」簡單說明一下,既然快慢指標在環內的某處已經相碰了。那麼,第二個for迴圈遍歷時,res指標還是在不停的繞環走,但是必定和i指標在環入口處相碰。

雙指標:

class solution 

cout << res;

for (int i = 0; res != i; i = nums[i])

return res;

}};

二分查詢

class solution 

}// 根據抽屜原理,小於等於 4 的數的個數如果嚴格大於 4 個,

// 此時重複元素一定出現在 [1, 4] 區間裡

if (cnt > mid) else

}return left;

}};

LeetCode 287 尋找重複數

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

LeetCode 287(尋找重複數)

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

leetcode287 尋找重複數

1.二分查詢 參考 可以認為有兩個陣列,乙個是原陣列,乙個是1 n的範圍陣列 無重複 每次對low high的範圍陣列做二分,取中間數mid,然後去原陣列中統計小於等於mid的數目,如果大於mid 如果無重複,那麼應該小於等於mid 說明重複的那個數字在1 mid之間,結合範圍即在 low mid之...