算法打卡日志-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;
}
posted @ 2020-11-27 17:24  PPPPu  阅读(63)  评论(0)    收藏  举报