【LeetCode】 350. 兩個陣列的交集 II
阿新 • • 發佈:2018-11-03
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;
}
};