leetcode_454四数相加II
一、题目
二、算法分析
这里我们需要注意的是,是四个不同的数组,而且可能每个数组里面有重复的元素。但是我们需要返回的只有满足条件的数目。
按照别人的分析如下:
最好的方法是先使用一个Hashmap存储两个数组元素之和,并统计其出现的数目,然后遍历另外两个数组的元素之和。这样的算法的复杂度是最小的,只有O(n^2)。
三、参考程序
- 首先定义 一个unordered_map,key放a和b两数之和,value 放a和b两数之和出现的次数。
- 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中。
- 定义int变量count,用来统计a+b+c+d = 0 出现的次数。
- 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 最后返回统计值 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的初始化,元素插入,以及元素查找,元素修改。