四数相加

题目

给你四个整数数组 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

思路

将前面的两个数组所有和的情况分别列出来,出现几次那么这个和(作为key)对应的value++,那么得到的是一个以所有和情况为key,value为次数的unordered_map,这里名称为compare
然后,再根据后面两个数的和进行处理

代码

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int,int>compare;
        for(int a:nums1){
            for(int b:nums2){
                compare[a+b]++;//这个是一个很重要的点,也就是map可以直接根据[]进行key和value的匹配
            }
        }


        // for(unordered_map<int,int>::iterator it = compare.begin();it!=compare.end();it++){
        //     cout<<(*it).first<<" "<<(*it).second<<endl;
        // }


        int count=0;
        for(int c:nums3){
            for(int d:nums4){
                if(compare.find(0-c-d)!=compare.end()){
                    //还有注意这里的这个元素compare[0-c-d]不用删除,因为是排列组合的问题,不用删除
                    //count++;注意这里的
                    count+=compare[0-d-c];
                }
            }
        }
        return count;
    }
};
posted @ 2023-03-08 12:19  铜锣湾陈昊男  阅读(8)  评论(0)    收藏  举报