python - 有人可以解释这个 if 语句是如何工作的吗?

标签 python algorithm

有人可以解释一下 if 语句是如何工作的或者下面代码中代码的含义吗?

我有两个列表,A 和 B,我需要查看是否存在一对元素,一个来自 A,另一个来自 B,这样交换它们将使两个列表的总和相等。

我的方法 O(n^2) 是找到 sumOfAsumOfB。 找到 halfdiff = (sumOfA - sumOfB)/2 对于 A 中的每个元素,查看是否存在 B[i] 以便 (A[j] - B[i]) = halfdiff

但下面的代码在 O(n+m) 中完成。而且我不明白这里“if”语句(第 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 值来完成此操作。

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,您问题中的部分代码也在做类似的事情。和 countitertools.Counter(A) (也就是说,它是一个将任何 x 映射到它在 A 中出现的次数的字典)。那么count[B[i] - d] > 0相当于有一个j这样 B[i] - d = A[j] , 或 B[i] - A[j] = (sum(B) - sum(A))/2 .

可能不是使用集合或字典,而是值 mA 中允许的最大值和 B .那么counting可以这样定义:

def counting(xs, m):
    r = [0] * (m+1)
    for x in xs:
        r[x] += 1
    return r

这是表示一组整数的一种简单但效率低下的方法,但它可以理解您问题的缺失部分并解释边界检查 0 <= B[i] - d and B[i] - d <= m如果你使用 set 或 dict,这是不必要的,但如果 counting 是必需的返回一个数组。

关于python - 有人可以解释这个 if 语句是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33797411/

相关文章:

Python/Tweepy UnicodeEncodeError

python - 阅读 igraph 中的 Disconected Graph for python

python - 寻找一种简单的校验和(或散列)算法,对最多 N 个字符的 ASCII 字符串无冲突

xml - XML 的最佳压缩算法?

c++ - C++中的两个堆栈算法

python - 如何将包含多个字符串的 python 数组保存到人类可读的文件中

python - 如何使用 Python 在 CSV 中写入新行

python - CMD无法正常读取 'C:\Program Files'

algorithm - 哪种算法可以根据历史对列表进行排名

c - RPN中运算符的优先级