287 尋找重複數

2022-05-19 16:48:09 字數 1108 閱讀 8134

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

示例 1:

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

輸出: 2

示例 2:

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

輸出: 3

說明:審題可以發現兩個關鍵點:

nums陣列長度為1+n,其中的數字範圍皆介於[1,n]

只有乙個重複的數字,但是可能出現2次或以上

由第1點可知:對於任意下標1 <= i <= n, 總有1 <= nums[i] <= n,即將nums陣列看為乙個鍊錶的話,是不會出現越界錯誤的。具體看為鍊錶的方式是將nums[i]作為下乙個元素的下標。

舉個例子:

nums = [1,3,4,2,2],假設有個頭節點head且值為0,鍊錶可以整理為

head->1->3->2->4->2->4->...

head後面之所以為1是因為nums[0] = 1;同理,nums[1] = 3; nums[3] = 2;以此類推

最後的省略號代表迴圈部分

由第2點可知:給出判斷的nums陣列形成的鍊錶必有環,且為單環

演算法說到如何判斷有環,以及尋找環的起點,常用的演算法為快慢指標。

快慢指標的思想如下:

宣告兩個指標,兩個指標的初始值都是鍊錶的頭指標,讓它們兩同時出發,快指標每次前移兩個節點,慢指標每次前移乙個節點。

快慢指標的思想如上所述,給出的證明可能不怎麼嚴謹,但應該還是能幫助理解的,具體的**如下。

#include #include using namespace std;

class solution

backpos = slow;

break;}}

return backpos;

}};int main()

; cout << s.findduplicate(nums) << endl;

return 0;

}

287 尋找重複數

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

287 尋找重複數

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

287 尋找重複數

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