LeetCode刷题笔记(Intersection of Two Arrays II)

忍不住又刷了一道题,这个题的答案或许会因不同语言的标准库而略有不同,下面来总结一下经验吧!

 具体题目如下:

Given two arrays, write a function to compute their intersection.

Example 1:

Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
Example 2:

Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]
Note:

Each element in the result should appear as many times as it shows in both arrays.
The result can be in any order.
Follow up:

What if the given array is already sorted? How would you optimize your algorithm?
What if nums1's size is small compared to nums2's size? Which algorithm is better?
What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?

题意分析: 

给定两个数组(数组没有特殊指明,应该可以为空集),请写一个能计算出它们重复元素的函数,由样例可知,重复元素有多少算多少。最后返回的结果可以以任何顺序。

解答如下:

方法一

由于需要返回多个重复元素,所以这里可以考虑用map记录数组的元素与其对应的个数。首先创建一个map型的变量record,并用record记录nums1中所有元素及其个数,然后再用nums2中每个元素去匹配record中记录,只要record[nums2[i]] > 0,就将nums2[i]存放到新建的vector型result中,最后返回result。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        map<int, int> record; //创建map型变量
        for (int i = 0; i < nums1.size(); i++)
            record[nums1[i]]++;
        vector<int> result;
        for (int i = 0; i < nums2.size(); i++)
            if(record[nums2[i]] > 0) {     //用nums2中元素去匹配record,结果大于0则表示与nums1有相同的元素
                result.push_back(nums2[i]); 
                record[nums2[i]]--;
            }
        return result;
    }
};

 提交后的结果如下:

 

 

方法二

由于方法一中借用了C++标准库中的map类型变量初始值为0的规定,所以其通用性可想而知。下面就来写写通用性比较强的解法。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        map<int, int> record;
        for (int i = 0; i < nums1.size(); i++)
            if (record.find(nums1[i]) == record.end()) //当元素第一次出现时,先将其的频数记为1,否则直接++操作
                record.insert(make_pair(nums1[i], 1));  //map的插入操作,需要配合make_pair函数使用,这与set是有区别的
            else
                record[nums1[i]]++;
        vector<int> result;
        for (int i = 0; i < nums2.size(); i++)
            if(record.find(nums2[i]) != record.end() && record[nums2[i]] > 0) {  //需要判断当前遍历到元素的个数是否仍被记录在record中。
                result.push_back(nums2[i]);
                record[nums2[i]]--;
                if (record[nums2[i]] == 0)  //如果当前遍历到的元素在record中记录的个数为0,则删掉该元素记录
                    record.erase(nums2[i]); // map的删除操作
            }
        return  result;
    }
};

提交后的结果如下:

日积月累,与君共进,增增小结,未完待续。    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值