leetcode刷题哈希表

哈希表

leecode349:两个数组的交集Ⅰ

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());
        }
};

leetcode350:两个数组的交集Ⅱ

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;
        }
};

leetcode1:两数之和

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 {};//都没能匹配上,则返回空集合;
        }
};

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值