字母异位词

题目:

两个数组的交集

解法-哈希表

思路:

  1. 将Num1存储在set容器nums_set中,可以去重
  2. 遍历num2,如果Nums_set中有num2,则将num2插入到result_set中

复杂度:

  • 时间复杂度:
  • 空间复杂度:

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
unordered_set<int> result_set; // 存放结果,之所以用set是为了给结果集去重
//通过传递 nums1.begin() 和 nums1.end(),
//可以将 nums1 中的所有元素一次性插入到 unordered_set 中,从而快速构建集合。
//unordered_set 自动去除重复元素,因此可以确保最终集合中没有重复项。
unordered_set<int> nums_set(nums1.begin(), nums1.end());
// 遍历nums2
for (int num : nums2) {
// 发现nums2的元素 在nums_set里又出现过
if (nums_set.find(num) != nums_set.end()) {
result_set.insert(num);
}
}
return vector<int>(result_set.begin(), result_set.end());
}
};

语法小点:

  1. unordered_set
    • 数据结构:基于哈希表
    • 无序存储
    • 去重
  2. set(ordered_set)
    • 数据结构:基于红黑树
    • 有序存储:元素按照升序排序
    • 去重
  3. 解释:unordered_set<int> nums_set(nums1.begin(), nums1.end());
    • nums1.begin():返回指向nums1向量中第一个元素的迭代器
    • nums1.end():返回指向nums1向量中最后一个元素下一个位置的迭代器
    • 将nums1向量中的所有元素插入到一个无序集合nums_set中,用于去除重复元素并提供快速查找。
  4. 解释: for (int num : nums2)
    • for循环用于遍历名为nums2的容器中的每个元素。循环变量num依次取nums2中的每一个值。通常用于对nums2中的每个元素执行相同的操作。
  5. 解释: if (nums_set.find(num) != nums_set.end()) { result_set.insert(num); }
    • nums_set.find(num):这个方法会在 nums_set 中查找是否存在值为 num 的元素。查找成功会返回一个指向该元素的迭代器;查找失败会返回 nums_set.end(),表示查找未找到该元素。
    • nums_set.find(num) != nums_set.end():这个条件判断返回的迭代器是否等于 nums_set.end()。
      如果不等于nums_set.end(),说明找到了 num,即 nums_set 中存在 num。
      如果等于 nums_set.end(),说明没有找到 num,即 nums_set 中不存在 num。