第454题.四数相加II(力扣LeetCode)

文章目录

  • 第454题.四数相加II
    • 题目描述
    • 哈希表:map

第454题.四数相加II

题目描述

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例 1:

输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
输出:2
解释:
两个元组如下:
1.(0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0
2.(1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0

示例 2:

输入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
输出:1

提示:

  • n == nums1.length
  • n == nums2.length
  • n == nums3.length
  • n == nums4.length
  • 1 <= n <= 200
  • -228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228

哈希表:map

这道题目是四个独立的数组,只要找到A[i] + B[j] + C[k] + D[l] = 0就可以,不用考虑有重复的四个元素相加等于0的情况

本题解题步骤:

1.首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
2.遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
3.定义int变量count,用来统计 a+b+c+d = 0 出现的次数。
4.在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count4.把map中key对应的value也就是出现次数统计出来。
5.最后返回统计值 count 就可以了

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        // 创建一个哈希表用来存储两数之和的频率
        unordered_map<int,int> map;
        // 初始化计数器,用来记录总的符合条件的元组数量
        int count=0;
        // 遍历第一个和第二个数组,并记录两个数组中元素之和及其出现的次数
        for(int a : nums1)
            for(int b : nums2)
                map[a+b]++;
        // 遍历第三个和第四个数组
        for(int c : nums3)
            for(int d : nums4)
                // 对于每对c和d,我们查找哈希表中是否存在和它们相加为0的数
                // 这里我们查找的是0-(c+d),也就是-c-d
                if(map.find(0-(c+d))!=map.end())
                    // 如果找到了,就将找到的和为零的组合数量添加到count中
                    count+=map[0-(c+d)];
        // 返回总的符合条件的元组数量
        return count;
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,c++,哈希算法)