1. 程式人生 > >【LeetCode】 350. 兩個陣列的交集 II

【LeetCode】 350. 兩個陣列的交集 II

1.題目

給定兩個陣列,編寫一個函式來計算它們的交集。

2.思路

此題對第一題的區別在於可以輸出相同數字
例如:輸入【1,2,2,1】,【2,2】;輸出【2,2】

step1:遍歷兩個向量;
step2:把兩個陣列重複的元素加入到vector res中(可以重複),並把此元素在nums2中刪除,避免重複;
step3:返回vector
注意:陣列1、2為空集的時候,直接返回空集

3.程式碼

class Solution {
public:
    vector<int> intersect(vector<int>&
nums1, vector<int>& nums2) { vector<int>res; if(nums1.size()==0||nums2.size()==0) return {}; else{ int l1=nums1.size(); int l2=nums2.size(); if(l1>l2) swap(nums1,nums2); for(int i=0;i<nums1.size();i++){ for(int j=0;j<nums2.size();j++){ if(nums1[i]==
nums2[j]){ //cout<<" "<<nums1[i]<<endl; res.push_back(nums1[i]); nums2.erase(nums2.begin()+j)-1; break; } } } } } return res; } };

4.優秀案例

step1:遍歷nums1,把元素存在在map中,以元素為key,元素對應數量為value;
step2:遍歷nums2,如果nums2中元素在map中value大於0,則把此元素放入res向量中;
step3:把此元素在map中對應的value-1;
step4:返回向量res。

class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        map<int, int> record;
        for(int i = 0; i < nums1.size(); i++)
            record[nums1[i]] ++;
        vector<int> resultVector;
        for(int j = 0; j <nums2.size(); j++)
        if(record[nums2[j]] > 0){
            resultVector.push_back((nums2[j]));
            record[nums2[j]] --;
            
        }
        return resultVector;
    }
};