算法刷题记录.leetcode454.四数相加

122 阅读1分钟

题目表述

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

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

来源:力扣(LeetCode) 链接:leetcode.cn/problems/4s…

题目分析

  • 整体思路:每两个数组求和。第一对数组求和后放入哈希表map。第二对数组求和时,去map中查询是否有这样的target,使得和为0。
  • 为什那么选择map做哈希表?
    因为需要存储第一对数组的和,及其个数(比如第一对数组中有两数和为9,但是能找到三对这样的元素)。

代码

class Solution {

public:

int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {

std::unordered_map<int,int> map1;

int count = 0;

for(int i=0;i<nums1.size();i++){ //建立map1

for(int j=0;j<nums2.size();j++){

int sum1 = nums1[i]+nums2[j];

auto iterator = map1.find(sum1);

if(iterator !=map1.end()){

iterator->second++;

}else{

map1.insert(pair<int, int>(sum1,1));

}

}

}

for(int i=0;i<nums3.size();i++){

for(int j=0;j<nums4.size();j++){

int target = -(nums3[i]+nums4[j]);

auto iterator2 = map1.find(target);

if(iterator2 != map1.end()){

count += iterator2->second;

}

}

}

return count;

\


}