LeetCode454.四数相加Ⅱ

在这里插入图片描述


LeetCode454.四数相加Ⅱ


题目:

 给你四个整数数组 nums1nums2nums3nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 < = i , j , k , l < n 0 <= i, j, k, l < n 0<=i,j,k,l<n
  • n u m s 1 [ i ] + n u m s 2 [ j ] + n u m s 3 [ k ] + n u m s 4 [ l ] = = 0 nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 nums1[i]+nums2[j]+nums3[k]+nums4[l]==0

示例:

  • 输入: n u m s 1 = [ 1 , 2 ] , n u m s 2 = [ − 2 , − 1 ] , n u m s 3 = [ − 1 , 2 ] , n u m s 4 = [ 0 , 2 ] nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] nums1=[1,2],nums2=[2,1],nums3=[1,2],nums4=[0,2]
  • 输出: 2 2 2
  • 解释: 两个元组如下:
    • ( 0 , 0 , 0 , 1 ) − > n u m s 1 [ 0 ] + n u m s 2 [ 0 ] + n u m s 3 [ 0 ] + n u m s 4 [ 1 ] = 1 + ( − 2 ) + ( − 1 ) + 2 = 0 (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0 (0,0,0,1)>nums1[0]+nums2[0]+nums3[0]+nums4[1]=1+(2)+(1)+2=0
    • ( 1 , 1 , 0 , 0 ) − > n u m s 1 [ 1 ] + n u m s 2 [ 1 ] + n u m s 3 [ 0 ] + n u m s 4 [ 0 ] = 2 + ( − 1 ) + ( − 1 ) + 0 = 0 (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0 (1,1,0,0)>nums1[1]+nums2[1]+nums3[0]+nums4[0]=2+(1)+(1)+0=0

解题思路:

 定义一个哈希表,然后遍历nums1nums2,用哈希表记录a+b出现的次数,再遍历nums3nums4,若有0-(c+d)出现,则加到结果中。

版本一:Java

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        int res = 0;
        Map<Integer, Integer> hash = new HashMap<Integer, Integer>(); 
        for(int a : nums1)
            for(int b : nums2){
                int sum = a + b;
                hash.put(sum, hash.getOrDefault(sum, 0) + 1);
            }
        for(int c : nums3)
            for(int d : nums4)
                res += hash.getOrDefault(0 - c - d, 0);
        return res;
    }
}

版本二:C++

class Solution {
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
        unordered_map<int, int> hash;
        for(int a : nums1)
            for(int b : nums2)
                hash[a + b] ++;
        int res = 0;
        for(int c : nums3)
            for(int d : nums4)
                if(hash.find(0 - (c + d)) != hash.end()) 
                	res += hash[0 - (c + d)];
        return res;
    }
};

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

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值