2022.12.26 哈希表刷题日志 Leetcode

349. 两个数组的交集

class Solution {
public:
   vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
   unordered_set<int>result;
   unordered_set<int>set(nums1.begin(),nums1.end());//存放结果的set,且不能重复
   for(int i:nums2)//遍历nums2的元素
   {
      if(set.find(i)!=set.end()){
         result.insert(i);
      }
   }
   return vector<int>(result.begin(),result.end());
    }
};

这道题要注意的就是,存放结果的result必须设置为unordered_set 

因为unordered_set类会再插入的时候自动去重

根据交集的定义只输出一个

所以用unordered_set

202. 快乐数

class Solution {
public:
int TheSumReturn(int n)
{
   // 获取每个位置上的数的平方和函数
   int sum = 0;
   while (n)
   {
      sum += (n % 10) * (n % 10);
      n /= 10;
   };
   return sum;
}
    bool isHappy(int n) {
unordered_set<int> result;
//一直执行,总会退出
  while (1)
   {
//如果n最后变成1或者一开始就是1,那么这个数就是快乐数
      if (n == 1)
      {
         return true;
      }
//如果循环中出现了重复,那说明这个数已经进入了无限循环,不是快乐数
      if (result.find(TheSumReturn(n)) != result.end())
      {
         return false;
      }
      result.insert(TheSumReturn(n));
      n=TheSumReturn(n);
   }
    }
};

1. 两数之和

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) { 
//因为要求返回下标,故使用map
        unordered_map<int,int>map;
//第一次循环 没有这个数就放在map当中
//有的话就把配对的数输出
        for(int i=0;i<nums.size();i++){
            int theTrueTarget=target-nums[i];
            auto iter=map.find(theTrueTarget);
            if(iter!=map.end()){
                return {iter->second,i};
            }
            map.insert(pair<int,int>(nums[i],i));
        }
        return {};
    }
};

454. 四数相加 II

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
 unordered_map<int, int> map;
    //一二次的和
    for (int i : nums1)
    {
        for (int j : nums2)
        {
            auto iter=map.find(i+j);
            if(map.find(i+j)!=map.end())
//这个数出现过
//就在原本的出现次数上加1
          
            {
                iter->second++;
            }
            else map.insert(pair<int,int>(i+j,1));

        }
    }
    //计算剩下的
    int count=0;
    for(int i:nums3)
    {
        for(int j:nums4)
        {
            int thefind=-(i+j);
            auto iter=map.find(thefind);
         if(map.find(thefind)!=map.end())
         {
            //每符合条件一次,就在count原本的基础上++second
            count+=iter->second;
         }
        }
    }



    return count;
    }
};

注释写在题上的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值