题目: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;
}
}