https://leetcode.cn/problems/4sum-ii/description/

<aside> 💡

思路:将四个数组分为两组,使用map记录nums1和nums2的和(key),以及该和出现的次数(val)

</aside>

// 使用map记录nums1+nums2,使用nums3+nums4对map进行查询
int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
	unordered_map<int, int> record12;
	int ans = 0;

	for (int i1 : nums1) {
		for (int i2 : nums2) {
			auto iter = record12.find(i1 + i2);
			if (iter == record12.end())
        // 两数的和作为key,其出现的次数作为val存入map
				record12.insert({ i1 + i2, 1 });
			else
				++(iter->second);
			iter = record12.find(i1 + i2);
		}
	}
	for (int i3 : nums3) {
		for (int i4 : nums4) {
			auto iter = record12.find(-(i3 + i4));
			if (iter != record12.end() && iter->second > 0) {
        // 一个解的所有实现方法全部加上
				ans += iter->second;
			}
		}
	}
	return ans;
}

第二版,与上面思路相同

int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    // <两数和, 出现的次数>
    unordered_map<int, int> sum12;
    unordered_map<int, int> sum34;

    for (int i = 0; i < nums1.size(); ++i) {
        for (int j = 0; j < nums2.size(); ++j) {
            int sum = nums1[i] + nums2[j];
            auto it = sum12.find(sum);
            if (it == sum12.end()) {
                sum12.insert({ sum, 1 });
            } else {
                ++(it->second);
            }
        }
    }
    for (int i = 0; i < nums3.size(); ++i) {
        for (int j = 0; j < nums4.size(); ++j) {
            int sum = nums3[i] + nums4[j];
            auto it = sum34.find(sum);
            if (it == sum34.end()) {
                sum34.insert({ sum, 1 });
            }
            else {
                ++(it->second);
            }
        }
    }

    int ans = 0;
    for (auto item : sum12) {
        auto it = sum34.find(-item.first);
        if (it != sum34.end()) {
            ans += item.second * it->second;
        }
    }
    return ans;
}