有人可以解释if语句是如何工作的或以下代码中代码的含义吗?
我有两个列表,A和B,我需要查看是否存在一对元素,一个来自A,另一个来自B,这样交换它们会使两个列表的总和相等。
我的方法,O(n ^ 2)是找到sumOfB
和halfdiff = (sumOfA - sumOfB)/2
。
找到(A[j] - B[i]) = halfdiff
对于A中的每个元素,请查看是否存在B [i]以便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
。
但是下面的代码在O(n + m)中完成。我不明白&#34;的意思,如果&#34;声明(第11行)。是否保证如果确实如此,我们有所需的配对?
forgotPwd route configured but showForgotPasswordLink set to false
答案 0 :(得分:1)
您必须找到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值来完成此操作。
def exists_swap(A, B):
sumA = sum(A)
sumB = sum(B)
bVals = set(sumB - 2 * bj for bj in B)
return any(sumA - 2 * ai in bVals for ai in A)
你问题中的部分代码做了类似的事情,除了d = (sum(B)-sum(A))/2
和count
是itertools.Counter(A)
(也就是说,它是映射任何{{1}的字典}到它在x
中出现的次数。然后,A
相当于count[B[i] - d] > 0
,j
或B[i] - d = A[j]
。
可能不是使用集合或词组,而是B[i] - A[j] = (sum(B) - sum(A))/2
值是m
和A
中允许的最大值。然后B
可以像这样定义:
counting
这是一种表示一组整数的简单但效率低下的方法,但它解释了问题中缺少的部分并解释了检查def counting(xs, m):
r = [0] * (m+1)
for x in xs:
r[x] += 1
return r
的边界,如果你使用set或dict,这是不必要的,但是如果0 <= B[i] - d and B[i] - d <= m
返回数组,则必需。
答案 1 :(得分:0)
实际上,它不是O(n+m)
。由于hashmap count
的使用,线性估计只是摊销。这些知识可以帮助您了解您的代码是
bool solve(A,B) {
sum_a = sum(A)
sum_b = sum(B)
sort(B)
for(val in A)
if( binary_search(B, val - (sum_b - sum_a)/2 ) )
return true
return false
}
正如保罗所指出的那样,0 <= B[i] - d and B[i] - d <= m
只是对count
论证的验证。顺便说一句,他的解决方案纯粹是线性的,实施得很好,而且理解起来要简单得多。