Leetcode 287. 尋找重復數
給定一個包含 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) 。
- 數組中只有一個重復的數字,但它可能不止重復出現一次。
//抽屜原理,查找哪邊的蘋果的數量大于了抽屜的數量
class Solution {
public:
int findDuplicate(vector<int> &nums) {
int n = nums.size() - 1;
int l = 1, r = n;//對1~n的數進行二分,而不是對nums中數二分
while (l < r) {
int mid = (l + r) >> 1;
int cnt = 0;
for (auto num : nums) cnt += (num >= l && num <= mid);
//如果小于等于左邊的抽屜數量(mid - l + 1),說明左邊一定沒有重復的,答案在右邊
if (cnt <= mid - l + 1) l = mid + 1;
else r = mid;
}
return l;
}
};
同時給出抄襲的人員鏈接和原文博主鏈接:大黃狗吃不上兩個菜:Leetcode 287. 尋找重復數 - 喝茶看狗叫 - 博客園
博主鏈接:LeetCode 287. 尋找重復數 - AcWing


浙公網安備 33010602011771號