454.四数相加Ⅱ

(写给未来遗忘的自己)

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
         
         std::unordered_map<int,int>nums1_2sum;
         int time=0;
         for(int num1:nums1){
            for(int num2:nums2){
                int sum_12=num1+num2;
                if(nums1_2sum.find(sum_12)!=nums1_2sum.end())
                {
                    nums1_2sum[sum_12]++;
                }else{
                    nums1_2sum[sum_12]=1;
                }
            }
         }
            for(int num3:nums3){
            for(int num4:nums4){
                int sum_34=num3+num4;
                if(nums1_2sum.find(-sum_34)!=nums1_2sum.end())
                {
                    time+=nums1_2sum[-sum_34];
                }
            }
         }
         
      return time;

    }
};

思路:

找到的是四个数的和为0,暴力求解就是四个for循环。(数据太多可能超时)

考虑两两数组相加(O(n^2)),然后查找是否有相反数(查找考虑哈希数表,O(1))。

哈希选择(std::undered_set  std::undered_map)?

因为我们的需求是找到有多少组,而不是找到有没有。所以我们需要一个记录和,一个记录出现的次数,采用std::undered_map。 利用key记录和的情况,利用value 记录出现的次数。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值