【问题标题】:Count pairs of elements in an array whose sum equals a given sum (but) do it in a single iteration(!)计算数组中总和等于给定总和的元素对(但)在单次迭代中完成(!)
【发布时间】:2021-02-19 22:13:42
【问题描述】:

给定一个整数数组和一个数字“sum”,在 SINGLE 迭代中求和等于给定“sum”的数组中整数对的数量。 (O(n) 时间复杂度不够!)。

通常,我会遍历数组两次,一次创建频率哈希图,另一次查找对数,如下所示

def getPairsCount(arr, n, sum): 
    m=defaultdict(int)      
    for i in range(0, n): #iteration NO. 1
 
        m[arr[i]] += 1

    twice_count = 0 
    for i in range(0, n): #iteration NO. 2
    
        twice_count += m[sum - arr[i]] 
        if (sum - arr[i] == arr[i]): 
            twice_count -= 1
    return int(twice_count / 2) 

面试官要求我在一次迭代中做同样的事情,而不是两次。我不知道如何在需要总和为 3 的情况下不破坏它,例如 {2,2,1,1}。

【问题讨论】:

  • 对于这种愚蠢的需求有一个常见的技巧:递归地编写程序。这样,看起来您只遍历数组一次。但递归实际上允许你遍历数组两次。
  • @Stef,它会节省时间吗?面试官在谈论如何迭代两次是没有效率的。
  • @不,它不会。 python中的递归很糟糕。实际上,您的算法很好;您可以轻松地将两个循环合二为一,而无需过多更改。诀窍是要注意,不是计算所有对然后除以 2,而是只计算索引 (i, j) 满足 i
  • 还要注意m=defaultdict(0) 是错误的。 defaultdict 需要一个返回默认值的函数;应该是m=defaultdict(lambda:0),或者更好的是m=defaultdict(int)
  • 此外,如果您以正确的顺序执行操作,则无需检查if (sum - arr[i] == arr[i]): twice_count -= 1;因为在将arr[i] 添加到哈希映射之前,您可以在哈希映射中检查sum-arr[i]

标签: python arrays algorithm hashmap


【解决方案1】:

另一种方式:

def pair_sum2(arr, k):
if len(arr)<2:
    return
seen=set()
output=set()
for num in arr:
    target=k-num
    print("target",target)
    if target not in seen:
        print("seen before add",seen)
        seen.add(num)
        print("seen",seen)
    else:
        output.add( (min(num, target), max(num, target)) )
        print("op:",output)
print ('\n'.join( map(str, list(output)) ) ) 

【讨论】:

    【解决方案2】:

    一种方法是在您使用它的同时构建哈希映射(因此只循环一次列表)。因此,对于数组中的每个值,检查您之前是否见过补码(sum 所需的值)。如果是这样,你知道你有一个新的对,你从看到的值中删除了补码。否则,您没有总和,而是将您刚刚看到的值相加。

    在代码中如下所示:

    from collections import defaultdict
    
    def get_pairs_count(array, sum): 
        pairs_count = 0
    
        seen_values = defaultdict(int)
        
        for value in array:
            complement = sum - value
            if seen_values[complement] > 0:
                pairs_count += 1
                seen_values[complement] -= 1
            else:
                seen_values[value] += 1
        
        return pairs_count
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-26
      • 2020-04-06
      相关资源
      最近更新 更多