算法刷题记录.leetcode349.两个数组的交集

104 阅读1分钟

题目描述

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

解题思路

数组一映射在哈希表中。将数组二中元素一一与哈希表比对,若出现,则将该元素加入结果数组

  • 数组一的哈希表:两种方法实现。
    方法一:利用数组;
    方法二:利用unordered_set, 这种数据结构可以理解为经过去重的无限存储的数组,底层实现为哈希值的映射。

  • 结果数组:本题中,要求结果去重,即结果数组元素唯一,因此利用unordered_set(自带去重)特性,将结果先保存在unordered_set中,最后转存为数组返回。

  • set数据结构共分三种set、unordered_set、multiset.

  • unordered_set:优先应用。它的底层实现是哈希值的映射,可以理解为经过去重的无限存储的数组

  • set: 底层实现为红黑树,集合有序时应用。

  • multiset: 底层实现为红黑树,集合有序+有重复时应用。

关于set的函数调用

  • 定义:unordered_set<int> nums_set
  • 插入元素:nums_set.insert(a)
  • 寻找元素(若找不到则返回最后一个元素):nums_set.find(a)!=nums1_set.end()
  • 将set赋值给数组:vector<int>(result_set.begin(),result_set.end())

set代码

class Solution {

public:

vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {

unordered_set<int> nums1_set;

unordered_set<int> result_set;

\


for(int num : nums1){

nums1_set.insert(num);

}

\


for(int num : nums2){

if(nums1_set.find(num)!=nums1_set.end()){

result_set.insert(num);

}

}

return vector<int>(result_set.begin(),result_set.end());

\
\
\


}

};

数组代码

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
        int hash[1005] = {0}; // 默认数值为0
        for (int num : nums1) { // nums1中出现的字母在hash数组中做记录
            hash[num] = 1;
        }
        for (int num : nums2) { // nums2中出现话,result记录
            if (hash[num] == 1) {
                result_set.insert(num);
            }
        }
        return vector<int>(result_set.begin(), result_set.end());
    }
};