442. Find All Duplicates in an Array
題目描述
題目連結:442. Find All Duplicates in an Array
給定一個長度為 n 的整數陣列,其中陣列中的數字在1到n之間(包括1和n),並且有些元素會重複出現,找到所有出現兩次的元素,並返回這些元素的陣列
限制條件
- 你必須在沒有額外空間的情況下實現這個解決方案(O(1) 空間複雜度)
- 時間複雜度應該是 O(n)
解題思路
此題要求找到所有重複的數字,並且要求解決方案的空間複雜度為 O(1)。因此,我們不能使用額外的陣列或集合來存儲數字。為了達到這一要求,我們可以利用原陣列本身來標記已經出現過的數字
- 由於需要保留原數字且陣列中數字皆為正數,可以將數字轉為負值來記錄
具體步驟如下:
- 遍歷陣列中的每一個數字
- 對於每個數字,取其絕對值並減一得到索引 i
- 將陣列中索引 i 處的數字取負值以標記該索引已經出現過
- 如果索引 i 處的數字已經是負數,表示該索引的數字已經出現過一次,此時將該數字添加到結果陣列中
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
const int n = nums.size();
vector<int> ans;
for (const int num : nums) {
const int i = abs(num) - 1;
nums[i] *= -1;
if (nums[i] > 0) {
ans.push_back(abs(num));
}
}
return ans;
}
};
複雜度分析
- 時間複雜度:O(n),其中 n 是陣列的長度。我們只需遍歷陣列一次
- 空間複雜度:O(1),除了結果外,沒有使用額外的空間