算法day17 四数相加

题目描述

思路:分治+哈希
如果我们采用暴力的解法,则需要嵌套四层for循环,这里我们优化,将四个数组两两分成一组,每次以两层for循环嵌套,我们的目标是要找出a+b+c+d = 0这样的元组的个数,所以在第一组,我们将可能的a+b添加到哈希表中,随后在第二个二层循环里,我们只需判断-(c+d)= a+b,相等的,我们将对应hash的值增加到cnt上(这里需要注意,符合条件的a+b可能有多组,但是当映射到hash中时,它们的个数将会以值的形式存储),最后返回即可。

代码如下

  int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    int n = nums1.size();
    int sum;
    int cnt = 0;
    unordered_map<int,int> hash;
    for(int i = 0;i < n;i++){
        for(int j = 0;j < n;j++){
            sum = nums1[i] + nums2[j];
            hash[sum]++;
        }
    }
    for(int k:nums3){
        for(int v:nums4){
            sum = -(k + v);
            if(hash.find(sum)!=hash.end()){
                cnt += hash[sum];
            }
        }
    }
    return cnt;
}

时间复杂度:O(n^2)
空间复杂度:O(k)

END

posted on 2025-04-22 14:12  sakura430  阅读(9)  评论(0)    收藏  举报