leetcode_454四数相加II


一、题目

二、算法分析

这里我们需要注意的是,是四个不同的数组,而且可能每个数组里面有重复的元素。但是我们需要返回的只有满足条件的数目。

按照别人的分析如下:

 最好的方法是先使用一个Hashmap存储两个数组元素之和,并统计其出现的数目,然后遍历另外两个数组的元素之和。这样的算法的复杂度是最小的,只有O(n^2)。

三、参考程序

  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中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回统计值 count 就可以了

   

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        //初始化unordered_map
        unordered_map<int, int> record;
        for(auto a:nums1){
            for(auto b: nums2){
                record[a+b]++;
            }
        }
        //记录count
        int count = 0;
        for(auto c:nums3){
            for(auto d:nums4){
                if(record.find(0-c-d)!=record.end()){
                    count =count + record[0-c-d];
                }
            }
        }
        return count;
    }
};

    注意这里涉及到了map的使用,首先是unordered_map的初始化,元素插入,以及元素查找,元素修改。