算法打卡日志-2020.11.27| LeetCode454
题目 454. 四数相加 II
这道题就是简单的遍历、相加,难点在于过于暴力的解法(解法1)会超时,需要找到优化点。
题解1主要的耗时之处在于第三个循环,直接将实际复杂度提升到了O(n4),需要优化,甚至去除这个循环。
代码分析
//题解1,暴力法
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int len = A.length;
int[] arr1 = new int[len * len];
int[] arr2 = new int[len * len];
//A+B
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
arr1[i * len + j] = A[i] + B[j];
}
}
//C+D
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
arr2[i * len + j] = C[i] + D[j];
}
}
int count=0;
//遍历两个数据,记录和为0的个数
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr2.length; j++) {
if (arr1[i]+arr2[j]==0){
count++;
}
}
}
return count;
}
//题解2,使用HashMap存储数据,可以在O(1)查找数据
public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
int len = A.length;
Map<Integer, Integer> map1 = new HashMap<>();
int count = 0;
//将A+B的值存储在HashMap中,并记录个数。
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
int tmp = A[i] + B[j];
map1.put(tmp, map1.getOrDefault(tmp, 0) + 1);
}
}
for (int i = 0; i < len; i++) {
for (int j = 0; j < len; j++) {
int tmp = -(C[i] + D[j]);
//在map中查找是否有数据为-(C[i]+D[j]),并得出数量
if (map1.containsKey(tmp)){
count=count+map1.get(tmp);
}
}
}
return count;
}