zoukankan      html  css  js  c++  java
  • 【LeetCode】 454、四数之和 II

    题目等级:4Sum II(Medium)

    题目描述:

    Given four lists A, B, C, D of integer values, compute how many tuples (i, j, k, l) there are such that A[i] + B[j] + C[k] + D[l] is zero.

    To make problem a bit easier, all A, B, C, D have same length of N where 0 ≤ N ≤ 500. All integers are in the range of -228 to 228 - 1 and the result is guaranteed to be at most 231 - 1.

    Example:

    Input:
    A = [ 1, 2]
    B = [-2,-1]
    C = [-1, 2]
    D = [ 0, 2]
    
    Output:
    2
    
    Explanation:
    The two tuples are:
    1. (0, 0, 0, 1) -> A[0] + B[0] + C[0] + D[1] = 1 + (-2) + (-1) + 2 = 0
    2. (1, 1, 0, 0) -> A[1] + B[1] + C[0] + D[0] = 2 + (-1) + (-1) + 0 = 0
    

      题意:给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。


    解题思路:

      本题是之前【LeetCode】18、四数之和的延伸,区别在于不是从一个数组中找四个数,而是从四个长度相同的数组中各找一个数,并且不要求我们记录对应的数,只统计次数。

      只统计满足条件的次数就稍微简单一些,如果采用暴力法,需要依次遍历四个数组,需要四层循环,时间复杂度太高了,这里还是回到我们最初解决两数之和的想法上去,用空间换时间,依旧使用HashMap。

      思路是:将四个数组分成两部分,两个为一组,求两个数组中所有元素两两之和,将和与其出现的次数保存在哈希表中,这样只要在两个哈希表中找到互为相反数的情况,就能得到所有的次数。

      更进一步,可以先对A和B的元素求和,然后将其和与次数保存在哈希表中,然后再遍历C和D元素之和时,只要在A+B的那个哈希表中出现了对应的相反数,那就是一组要找的解了,这样做可以节省一个哈希表的空间,同时也省去最后再比较两个哈希表的开销。

      并不难理解,参考以下代码:

    class Solution {
        public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
            Map<Integer,Integer> a_And_b=new HashMap<>(); //<a和b的和,出现次数>
            for(int a:A){  //两层循环,将A和B元素之和及其出现次数保存到哈希表
                for(int b:B){
                    a_And_b.put(a+b,a_And_b.getOrDefault(a+b,0)+1);
                }
            }
            //然后再遍历C和D,两两元素求和,只要和的相反数在哈希表a_And_b中出现了几次,即说明有几次为0
            int res=0;
            for(int c:C){
                for(int d:D){
                    int target=-1*(c+d); //c+d的相反数
                    if(a_And_b.containsKey(target))
                        res+=a_And_b.get(target);
                }
            }
            return res;
        }
    }
    

      时间复杂度:O(n^2),空间复杂度:一个哈希表的开销,最多是O(2n)

    总结

      本题还是比较有意思的,特别是对哈希表的运用很灵活。

  • 相关阅读:
    小作业5
    小作业4
    Matplotlib基础
    Numpy学习笔记(下篇)
    Numpy学习笔记(上篇)
    机器学习的经典算法与应用
    opencv学习笔记D01
    Markdown新手入门
    python之生成器yeild
    pyinstaller打包.py程序为.exe操作指南
  • 原文地址:https://www.cnblogs.com/gzshan/p/11129770.html
Copyright © 2011-2022 走看看