131.哈希表:两个数组的交集(力扣)

题目描述:

代码解决:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 创建一个无序集合result_set,用于存储结果(交集元素)
        unordered_set<int> result_set;
        
        // 创建一个无序集合nums_set,并用nums1的元素初始化
        unordered_set<int> nums_set(nums1.begin(), nums1.end());
        
        // 遍历nums2的每个元素
        for (int num : nums2) {
            // 如果nums_set中存在num,将其添加到result_set中
            if (nums_set.find(num) != nums_set.end()) {
                result_set.insert(num);
            }
        }
        
        // 将result_set中的元素转换为向量并返回
        return vector<int>(result_set.begin(), result_set.end());
    }
};

这段代码实现了intersection函数,该函数返回两个整数向量nums1nums2的交集。交集是指同时出现在两个向量中的元素,且不包含重复的元素。

代码中使用了一个unordered_set来存储结果,这是因为unordered_set可以自动去除重复元素,并且提供了快速的查找能力。首先,将nums1的元素插入到unordered_set nums_set中。然后,遍历nums2,对于每个元素,检查它是否存在于nums_set中。如果存在,就将它插入到result_set中。最后,将result_set转换成vector并返回。

这里是详细的步骤:

  1. 创建一个空的unordered_set result_set,用于存储交集。
  2. 创建一个unordered_set nums_set,并将nums1的元素插入到其中。由于unordered_set会自动去重,所以nums_set中只包含nums1中的唯一元素。
  3. 遍历nums2中的每个元素num
  4. 使用find函数在nums_set中查找num。如果找到了,说明num是交集的一部分,应该被加入到result_set中。
  5. result_set转换成vector,因为题目要求返回的是一个向量。
  6. 返回结果向量。

这个实现的时间复杂度是O(m + n),其中m是nums1的长度,n是nums2的长度。空间复杂度是O(m),因为需要存储nums1的元素集合。如果nums1nums2的元素非常多,这可能会导致较大的内存使用。如果内存使用是一个问题,可以考虑只存储较小数组的元素集合,并在较大的数组上执行查找操作。

解法二:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        // 创建一个无序集合result_set,用于存储结果(交集元素)
        unordered_set<int> result_set;
        
        int hash[1005]={0};

        for(int num:nums1)
        {
            hash[num]=1;
        }

        for(int num:nums2)
        {
            if(hash[num]==1)
            {
                result_set.insert(num);
            }
        }
        
        // 将result_set中的元素转换为向量并返回
        return vector<int>(result_set.begin(), result_set.end());
    }
};

这段代码也是用于解决求两个整数向量nums1nums2交集的问题。与之前的代码不同,这段代码使用了一个整型数组hash来代替unordered_set来存储nums1中的元素。

以下是代码的步骤:

  1. 初始化一个大小为1005的整型数组hash,所有元素都设为0。这里假设nums1nums2中的元素都是非负数,并且最大值不会超过1004。如果有不同的范围,需要相应地调整数组的大小。

  2. 遍历nums1中的每个元素num,将hash[num]设为1,表示nums1中存在这个元素。

  3. 遍历nums2中的每个元素num,检查hash[num]是否为1。如果为1,说明num同时存在于nums1nums2中,将其插入到result_set中。

  4. result_set中的元素转换为向量并返回。

这个实现的时间复杂度是O(m + n),其中m是nums1的长度,n是nums2的长度。空间复杂度是O(1),因为使用的额外空间(数组hash)的大小是固定的,与输入字符串的长度无关。这种方法在元素的范围较小且已知时是有效的,但如果元素的范围很大或者未知,那么这种方法可能不适用,因为数组的大小将受到限制。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清酒。233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值