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