• 4sumii


    problem description:

      there is four number list named A,B,C,D; now you should out put the num of  tuples which statisfy A[i] +B[j]+C[k]+D[l] =0 

    i.e:

    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中的每个值两两相加,将所得出的值的相反数作为哈希表的索引,即可
    得知相应的值有几种解法,然后进行累加。
    python 实现方式:
    class Solution(object):
        def fourSumCount(self, A, B, C, D):
            """
            :type A: List[int]
            :type B: List[int]
            :type C: List[int]
            :type D: List[int]
            :rtype: int
            """
            dicts = {}
            for i in A:
                for j in B:
                    sums = i+j
                    if sums not in dicts:
                        dicts[sums] = 1
                    else:
                        dicts[sums] += 1
            out = 0
            for k in C:
                for l in D:
                    sums =-(k + l)
                    if sums in dicts:
                        out += dicts[sums]
            return out        
                    

    以上的方法虽有不错,但是还不是最精炼的python代码:

    最精炼的python代码,用到了counter模块下的collection函数。它能够统计出相同数值的个数,本质上还是个哈希表

    def fourSumCount(self, A, B, C, D):
        AB = collections.Counter(a+b for a in A for b in B)
        return sum(AB[-c-d] for c in C for d in D)

    以上的第一个代码是个人想法,第二个精炼的代码参考自leetcode上stefanporchmann的代码

  • 相关阅读:
    POJ 1466 最大独立点集
    POJ 3159 差分约束
    POJ 3411 DFS
    POJ 2665 模拟,,
    POJ 3134 Power Calculus ID-DFS +剪枝
    POJ 1543 暴搜
    455. Assign Cookies
    715. Range Module
    530. Minimum Absolute Difference in BST
    493. Reverse Pairs(BST, BIT, MergeSort)
  • 原文地址:https://www.cnblogs.com/whatyouknow123/p/6754332.html
Copyright © 2020-2023  润新知