题目

给定两个数组 nums1nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

示例 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());
    }
};