两个数组的交集---leetcode 350题,终于对哈希有了一点理解的一道题

通过讲解LeetCode第350题,介绍如何利用排序、哈希表和双指针方法求解两数组的交集。解法1采用STL的sort和set_intersection函数,解法2利用哈希表记录元素出现次数,解法3则是排序后使用双指针。这些方法帮助理解哈希在解决实际问题中的应用。
摘要由CSDN通过智能技术生成

 

解法1:调用stl函数

sort函数排序,创建一个目标容器result,容量nums1,nums2小的那个,set_intersection函数求交集,但由于它结果返回的是目标容器的最后一个元素迭代器,所以再创建一个容器v1,将result容器的开始元素到result最后一个元素拷贝,输出v1

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        vector<int> result;
        result.resize(min(nums1.size(),nums2.size()));
        vector<int>::iterator it = set_intersection(nums1.begin(),nums1.end(),nums2.begin(),nums2.end(),result.begin());
        vector<int> v1(result.begin(),it);
        return v1;
    }
};

解法2:

刚开始学哈希表,其实有一点蒙,看完这道题,我有点懂了。

首先不知道map的大家可以看看我之前写的map的文章。然后说这题的思路

首先,我们比较nums1和nums2的size,如果 nums1大,交换他俩的元素

然后,创建一个map容器,我觉得leetcode里边对我这种新手可能还是讲的不够细,这里我讲细一点,首先map容器里有一个key,一个value,对于这道题,nums1里的元素就对应map里面的key,每个元素的个数就对应value,所以当下边循环1执行完以后,map容器里应该是m={{2,2}}(这里我们用上边的例1,nums1和nums2的元素交换了哦!!!)

接着,执行循环2,遍历nums2的元素,if条件判断,是否m[num] > 0,符合条件,就把num对应的数写进result,

最后输出result

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size()>nums2.size())
        {
            nums1.swap(nums2);
        }
        map<int,int> m;
        for(int num : nums1)            // 1
        {
            ++m[num];
        }
        vector<int> result;
        for(int num : nums2)            // 2
        {
            if(m[num] > 0)
            {
                result.push_back(num);
                --m[num];
            }
        }
        return result;
    }
};

 解法3;排序加双指针

首先对两个数组进行排序,然后使用两个指针遍历两个数组。

初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        sort(nums1.begin(),nums1.end());
        sort(nums2.begin(),nums2.end());
        vector<int> result;
        int index1 = 0, index2 = 0;
        while(index1<nums1.size() && index2 < nums2.size())
        {
            if(nums1[index1] == nums2[index2])
            {
                result.push_back(nums1[index1]);
                index1++;
                index2++;
            }else if(nums1[index1] > nums2[index2])
            {
                index2++;
            }else{
                index1++;
            }
        }
        return result;
    }
};

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

目标成为slam大神

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

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

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

打赏作者

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

抵扣说明:

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

余额充值