給定兩個數組?nums1
?和?nums2
?,返回?它們的?
交集
?。輸出結果中的每個元素一定是?唯一?的。我們可以?不考慮輸出結果的順序?。
示例 1:
輸入:nums1 = [1,2,2,1], nums2 = [2,2] 輸出:[2]
示例 2:
輸入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 輸出:[9,4] 解釋:[4,9] 也是可通過的
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
思路:
- 使用?
unordered_set
(哈希集合)來存儲?nums1
?中的元素,利用哈希集合的去重特性。 - 遍歷?
nums2
?中的每個元素。 - 對于?
nums2
?中的每個元素,檢查它是否存在于?nums1
?的哈希集合中。 - 如果存在,將該元素插入到結果?
unordered_set
?中,同樣利用哈希集合的去重特性。 - 將結果?
unordered_set
?轉換為?vector
?并返回。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;unordered_set<int> nums0(nums1.begin(), nums1.end());for (int i=0;i<nums2.size();i++) {if (nums0.find(nums2[i]) != nums0.end()) {result.insert(nums2[i]);}}return vector<int>(result.begin(), result.end());}
};
算法利用了哈希集合的高效查找和插入特性(平均時間復雜度為 O(1)),通過一次遍歷確定交集,保證了結果的唯一性,使得整體時間復雜度為 O(n+m),其中 n 和 m 分別是兩個數組的長度。
方法二:使用哈希表來解決(只適用于給定數組范圍不大的情況)
?
-
初始化數據結構:定義一個
unordered_set
類型的結果集合result_set
用于存儲最終的交集結果,以及一個大小為 1005 的整型數組hash
用作計數器,數組的每個元素初始值設為 0。 -
記錄
nums1
中的元素:遍歷數組nums1
,使用hash
數組來記錄nums1
中每個元素的出現次數。由于題目給定數組元素的范圍是 0 到 1000,所以hash
數組的大小設置為 1005(1000 + 1 + 1,考慮到數組索引從 0 開始)。 -
查找交集:遍歷數組
nums2
,對于nums2
中的每個元素,檢查它在hash
數組中的對應位置是否為 1。如果是,說明該元素也在nums1
中出現過,即屬于兩個數組的交集,將其插入到result_set
中。 -
轉換結果:將
result_set
轉換為vector<int>
類型并返回,這樣就得到了最終的交集結果數組。
class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {unordered_set<int> result;int hash[1005] = {0};for (int num : nums1) {hash[num] = 1;}for (int num : nums2) { if (hash[num] == 1) {result.insert(num);}}return vector<int>(result.begin(), result.end());}
};