1.二分查詢
參考:**)
可以認為有兩個陣列,乙個是原陣列,乙個是1-n的範圍陣列(無重複),每次對low-high的範圍陣列做二分,取中間數mid,然後去原陣列中統計小於等於mid的數目,如果大於mid(如果無重複,那麼應該小於等於mid),說明重複的那個數字在1-mid之間,結合範圍即在(low-mid之間)。否則說明小於1-mid之間無重複,重複的應該在mid+1到hight之間
int
findduplicate
(vector<
int>
& nums)
if(count>mid) high=mid;
else low=mid+1;
}return low;
}
2.快慢指標
參考:
int
findduplicate
(vector<
int>
& nums)
fast =0;
//快指標回到起點,慢指標在相遇點,兩個一起走一步
while
(fast != slow)
return slow;
}return-1
;}
解釋參考:
假設重複的數字是x,對應的兩個下標分別為a和b,a和b也在陣列裡,當到a時,下一步會到x,經過一段時間後遍歷到b時還會到x,一次迴圈。即環的起點就是那個重複的元素
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說明 不能更改原陣列 假設陣列是唯讀的 只能使用...
Leetcode 287 尋找重複數
給定乙個包含 n 1 個整數的陣列 nums,其數字都在 1 到 n 之間 包括 1 和 n 可知至少存在乙個重複的整數。假設只有乙個重複的整數,找出這個重複的數。示例 1 輸入 1,3,4,2,2 輸出 2示例 2 輸入 3,1,3,4,2 輸出 3說明 不能更改原陣列 假設陣列是唯讀的 只能使用...