题目
给定两个数组 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
解答
- 暴力解法
class Solution {
public:
vector<int> deduplicate(vector<int>& nums) {
// 手动去重
int n = nums.size();
if (n <= 1) return nums;
int p = 0,q = 1;
while (q < n) {
// 0 0 1 2 2 3 4
if (nums[p] == nums[q]){
++q;
}
else {
nums[p+1] = nums[q];
++p;
++q;
}
}
vector<int> newNums(nums.begin(), nums.begin() + p + 1);
return newNums;
}
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 排序
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
// 对两个数组进行去重
vector<int> newNums1 = deduplicate(nums1);
vector<int> newNums2 = deduplicate(nums2);
// 初始化结果数组
vector<int> results;
int n1 = newNums1.size();
int n2 = newNums2.size();
// 暴力便利
for (int i = 0; i < n1; i++) {
for (int j = 0; j < n2; j++) {
if (newNums1[i] == newNums2[j]) {
results.push_back(newNums1[i]);
}
}
}
// 返回结果数组
return results;
}
};
- 使用哈希表
C++中,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set;
unordered_set<int> nums1set(nums1.begin(), nums1.end());
for (int num:nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums1set.find(num) != nums1set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};