哈希表
class Solution{
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
unordered_set<int> result_set;
unordered_set<int> nums_set(nums1.begin(), nums1.end());
for(int num : nums2)
{
if(nums_set.find(num) != nums_set.end())//如果nums2中存在与nums1中相同的元素
result_set.insert(num);//将其插入到result_set中自动去重;
}
return vector<int>(result_set.begin(), result_set.end());
}
};
class Solution{
public:
vector<int> intersect(vector<int>& nums1, vector<int>& nums2)
{
if(nums1.size() > nums2.size())
return intersect(nums2, nums1);//这是为了保证从小的数组开始遍历,减少空间复杂度
unordered_map<int, int> cnt;//因为元素数量越少,里面相交的元素更有可能少一些;
vector<int> ans;
for(int num : nums1)//将nums1映射到cnt中;
++cnt[nums1[num]];
for(int num : nums2)
{
if(cnt.count(num))//如果找到相交的元素(前面的处理保证了这里找到的次数会少一些)
{
ans.push_back(num);//先将其放入ans数组保存;
--cnt[num];//最为关键的一步:cnt中的num元素次数要减少1,保证取的是两数组中
} //较少的次数;
if(cnt[num] == 0)
cnt.erase(num);//如果次数降为0,则删掉该元素,不用再进行比较;
}
return ans;
}
};
class solution{
public:
vector<int> twoSum(vector<int>& nums, int target)
{
unordered_map<int, int> cnt;//用来存放已经遍历过的数值及其下标;
for(int i = 0; i < nums.size(); i++)
{
auto iter = cnt.find(target - nums[i]);//在cnt中寻找与当前值能成功匹配的元素;
if(iter != cnt.end())//如果成功匹配
return {iter->second, i};//注意返回的应该是下标;
cnt.insert(pair<int,int>(nums[i], i);//如果没有能够匹配的,则将其加入cnt;
}
return {};//都没能匹配上,则返回空集合;
}
};