LeetCode第16题。
题意大概是:给定4个长度相等的int数组,从每个数组中任取一个值相加和为0,问共有多少种选择方式?数据大小在0-500.
分析:如果暴力求解,用四重循环,时间复杂度O(n4),肯定会超时,不可取。用三层循环,使用一个查找表,时间复杂度为O(n3),很吃力,估计会超时。如果将前2个数组选取的2个值的和与出现的频次以键值对的方式存入Map中,村完后,然后在另外两个数组中两重循环遍历进行查表(以差值进行查表),设计一个计数器,若存在,则加上哈希值(即出现的频次),时间复杂度为O(n2)级别。5002=250000 ,计算机能够在1s之内计算完,是一个可行的方案。
附代码:
public static int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int count=0;
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<A.length;i++){
for(int j=0;j<B.length;j++){
int sum1 = A[i]+B[j];
if(map.containsKey(sum1)){
map.put(sum1, map.get(sum1)+1);
}else{
map.put(sum1,1);
}
}
}
for(int i=0;i<C.length;i++){
for(int j=0;j<D.length;j++){
int sum2 = 0-C[i]-D[j];
if(map.containsKey(sum2)&&map.get(sum2)>0){
count+=map.get(sum2);
}
}
}
return count;
}