(写给未来遗忘的自己)
class Solution {
public:
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
std::unordered_map<int,int>nums1_2sum;
int time=0;
for(int num1:nums1){
for(int num2:nums2){
int sum_12=num1+num2;
if(nums1_2sum.find(sum_12)!=nums1_2sum.end())
{
nums1_2sum[sum_12]++;
}else{
nums1_2sum[sum_12]=1;
}
}
}
for(int num3:nums3){
for(int num4:nums4){
int sum_34=num3+num4;
if(nums1_2sum.find(-sum_34)!=nums1_2sum.end())
{
time+=nums1_2sum[-sum_34];
}
}
}
return time;
}
};
思路:
找到的是四个数的和为0,暴力求解就是四个for循环。(数据太多可能超时)
考虑两两数组相加(O(n^2)),然后查找是否有相反数(查找考虑哈希数表,O(1))。
哈希选择(std::undered_set std::undered_map)?
因为我们的需求是找到有多少组,而不是找到有没有。所以我们需要一个记录和,一个记录出现的次数,采用std::undered_map。 利用key记录和的情况,利用value 记录出现的次数。