简单题,10分钟秒杀
题目:
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9]
思路:
用一个数组hashTable来存储数组中该数字出现的次数。两个set存数组,遍历找交集,循环输出次数个数字。
代码:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 使用hashTable存储它的出现次数
int hashTable1[1100] = {0};
int hashTable2[1100] = {0};
set<int> st1, st2; // 放数组
int i = 0;
// 遍历,使vector变为set存储,记录数字出现次数
for(i = 0; i < nums1.size(); i++){
st1.insert(nums1[i]);
hashTable1[nums1[i]]++;
}
for(i = 0; i < nums2.size(); i++){
st2.insert(nums2[i]);
hashTable2[nums2[i]]++;
}
vector<int> ans;
// 遍历找交集,并存交集数字到新数组ans中(存times次)
for(set<int>::iterator it=st1.begin(); it!=st1.end(); it++){
if(st2.find(*it) != st2.end()){
int times = hashTable1[*it];
if(times > hashTable2[*it]){
times = hashTable2[*it];
}
while(times != 0){
ans.push_back(*it);
times--;
}
}
}
return ans;
}
};
运行结果:
大佬解法:
class Solution {
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
// 先对两个数组进行排序,这样好比较
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
// 定义两个指针,分别指向两个数组
int p=0, q=0;
// 设置交集数组
vector<int> ans;
// 如果任何一个数组结束了,那么另一个肯定跟他没有交集
while(p != nums1.size() && q != nums2.size()){
// 如果一个指针指向的元素比另一个小,则让它++
if(nums1[p] < nums2[q]){
p++;
}else if(nums2[q] < nums1[p]){
q++;
}else if(nums1[p] == nums2[q]){ // 指向元素相同,则压入栈
ans.push_back(nums1[p]);
p++;
q++;
}
}
return ans;
}
};
运行结果: