leetcode350 两个数组的交集

还是用了暴力算法,因为别的写不出来,效率极低,nnd,贴代码

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) 
    {
        int m = nums1.size();
        int n = nums2.size();
        vector<vector<int> > good(m,vector<int>(n,0)); 
        vector<int> nice;
        for(int i = 0 ; i < m ; i++)
        {
            for(int j = 0 ; j < n ; j++)
            {
                if(nums1[i] == nums2[j]  && good[i][j]!=-1)
                {
                    good[i][j] = 1;
                    nice.push_back(nums1[i]);
                    for(int k = 0 ; k < m ; k++)
                    {
                        if(k!=i)
                        good[k][j] = -1;
                    }

                    for(int k = 0 ; k < n ; k++)
                    {
                        if(k!=j)
                        good[i][k] = -1;
                    }
                }
            }
        }
        return nice;

    }
};

之后是哈希表的做法,首先找到一个长度较小的数组,进行遍历,并将其中的元素放入哈希表,并记录个数。之后就遍历第二个数组,每遇到一个哈希表中存在的数,就将对应的数目减一,并将该元素存入需返回的数组中,很秀。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) 
    {
        int m = nums1.size();
        int n = nums2.size();
        if(m>n)
        {
            intersect(nums2, nums1);
        }
        unordered_map<int,int> good;
        for(int i:nums1)
        {
            good[i]++;
        }
        vector<int> nice;
        for(int i:nums2)
        {
            if(good[i]>0)
            {
                good[i]--;
                nice.push_back(i);
            }
        }
        return nice;
    }
};

 

posted @ 2021-03-05 20:50  zhaohhhh  阅读(39)  评论(0)    收藏  举报