有人能解释if语句是如何工作的,或者下面代码中代码的含义吗?你知道吗
我有两个列表,A和B,我需要看看是否存在一对元素,一个来自A,另一个来自B,这样交换它们将使两个列表的总和相等。你知道吗
我的方法O(n^2)是找到sumOfA
和sumOfB
。
找到halfdiff = (sumOfA - sumOfB)/2
对于A中的每个元素,看是否有B[i],这样(A[j] - B[i]) = halfdiff
。你知道吗
但是下面的代码是在O(n+m)中完成的。我不明白这里“如果”语句(第11行)的意思。它能保证如果这是真的,我们有所需的一对吗?你知道吗
1 def fast_solution(A, B, m):
2 n = len(A)
3 sum_a = sum(A)
4 sum_b = sum(B)
5 d = sum_b - sum_a
6 if d % 2 == 1:
7 return False
8 d //= 2
9 count = counting(A, m)
10 for i in xrange(n):
11 if 0 <= B[i] - d and B[i] - d <= m and count[B[i] - d] > 0:
12 return True
13 return False
你必须找到
i
,j
,这样sum(A) - a[i] + b[j] = sum(B) - b[j] + a[i]
,或者等价地,sum(A) - 2*a[i] = sum(B) - 2*b[j]
。你知道吗您可以通过计算右侧的所有可能结果,然后搜索可能的i值来实现这一点。你知道吗
你问题中的部分代码也在做类似的事情,除了
d = (sum(B)-sum(A))/2
和count
是itertools.Counter(A)
(也就是说,它是一个dict,将任何x
映射到它在A
中出现的次数)。则count[B[i] - d] > 0
等价于存在j
,使得B[i] - d = A[j]
,或B[i] - A[j] = (sum(B) - sum(A))/2
。你知道吗可能不是使用集合或dict,值
m
是A
和B
中允许的最大值。那么counting
可以这样定义:这是一种简单但效率低下的表示整数集的方法,但它可以解释问题中缺少的部分,并解释边界检查
0 <= B[i] - d and B[i] - d <= m
,如果使用set或dict,这是不必要的,但是如果counting
返回数组,这是必要的。你知道吗实际上,它不是
O(n+m)
。由于hashmapcount
的使用,线性估计只是摊销。这些知识可以帮助您理解您的代码是的模糊版本正如Paul指出的,
0 <= B[i] - d and B[i] - d <= m
只是对count
论证的验证。顺便说一句,他的解决方案是纯线性的,很好地实现和更简单的理解。你知道吗相关问题 更多 >
编程相关推荐