日常刷题LeetCode——四数相加 II

Posted 程序员茶馆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日常刷题LeetCode——四数相加 II相关的知识,希望对你有一定的参考价值。

题目:LeetCode 高级 - 四数相加 II

解题思路一(暴力解法)

四重循环,时间复杂度,这显然不可接受。

public class Solution 
    public int FourSumCount(int[] A, int[] B, int[] C, int[] D) 
        var length=A.Length;
        var count=0;
        for(var i=0;i<length;i++)
            for(var j=0;j<length;j++)
                for(var k=0;k<length;k++)
                    for(var l=0;l<length;l++)
                        if(A[i]+B[j]+C[k]+D[l]==0)
                           count++;
                    
                
            
        
        return count;
    

解题思路二(采用Hash)

如果前一半某元组之和为A[i]+B[j]=sum,需要使得A[i]+B[j]+C[k]+D[l]=0,那么就需要后一半存在某元组使得C[k]+D[l]=-sum。因此我们可以用二重循环将前一半元组的和取反存入字典中,然后再用二重循环在后一半求得元组之和,并在上述字典中寻找是否存在该值。该解法可将算法复杂度降低到

public class Solution 
    public int FourSumCount(int[] A, int[] B, int[] C, int[] D) 
        var length=A.Length;
        var map=new Dictionary<int,int>(length);
        for(var i=0;i<length;i++)
            for(var j=0;j<length;j++)
                var sum=A[i]+B[j];              
                if(map.TryGetValue(-sum,out var num))
                     map[-sum]=num+1;
                else                  
                     map.Add(-sum,1);
                
            
        
        var count=0;
         for(var i=0;i<length;i++)
            for(var j=0;j<length;j++)
                var sum=C[i]+D[j];                
                if(map.TryGetValue(sum,out var num))
                  count+=num;
                
            
        
        return count;
    

 

以上是关于日常刷题LeetCode——四数相加 II的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 454.四数相加II

LeetCode Java刷题笔记—445. 两数相加 II

leetcode 454. 四数相加 II java

刷题14:两数相加 II

题目地址(4sum-ii/“>454. 四数相加 II)

(哈希表)Java 求解四数相加 II