454. 四数相加 II

119 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

454. 四数相加 II

  • 题号:力扣454
  • 知识点:数组,哈希
  • 总结 题干: 在这里插入图片描述在这里插入图片描述 思路:
  • 1.简单的暴力想法就是四层循环遍历四个数组,计算四数相加为0的次数,但这种想法应该会超时。
  • 2.划分为两两相加,nums1和nums2求和得sum1,nums3和nums4求和得sum2,然后再计算sum1 + sum2 == 0的次数,这样可以将时间复杂度降到n2n^2
  • 3.再改进一下,先对nums1和nums2求和,并将求和的结果存储在一个哈希表中,key值为他们的和,value值为这个和出现的次数。
  • 4.然后在对nums3和nums4求和,然后再用0 -(n3+n4)记为delta,然后再在哈希表中查找deltadelta的value值就是当前这种nums3和nums4的组合下满足nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0的次数。
  • 5.两侧循环对nums3和nums4遍历完成后的count就是所有的nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0组合的次数
class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> umap;
        // 统计nums1和nums2和一种有多少种,以及每种出现的次数
        for (int n1 : nums1){
            for (int n2 : nums2){
                umap[n1+n2] += 1;
            }
        }
        int count = 0;
        for (int n3 : nums3){
            for (int n4 : nums4){
                // (0 - n3 - n4)表示凑成0需要的nums1和nums2组成的和的值
                // 查找nums1和nums2组成的和的值是否存在
                if (umap.find(0 - n3 - n4) != umap.end()){
                    // 若存在,它们出现的次数就是和为0的次数
                    count += umap[0 - n3 - n4];
                }
            }
        }
        return count;
    }
};