题目:
思路:
四个数组且只返回个数,暴力法很容易想到,即四重循环;
四重循环复杂度太高了!需要优化!
缩小问题规模是编程常用的思维,即把四个数相加拆解成多次两个数相加;
这里把nums1和nums2的所有和作为一个数组,剩余两个数作为一个数组;
此时把问题缩小为两数组相加之和!
对于两数相加之和,我的常用解法是存储一个数组,遍历另一个数组,同时查找存储的数组是否有满足条件的值;
存储查找,哈希表!
根据题目,哈希表使用map,定义为两小数组之和的值与同一值出现的次数。
代码:
class Solution { public: int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) { int ret=0; unordered_map<int,int> has1; for(auto i:nums1){ for(auto j:nums2){ has1[i+j]++; } } for(auto i:nums3){ for(auto j:nums4){ if(has1.count(0-(i+j))) ret+=has1[0-(i+j)]; } } return ret; } };