Codility Counting Lesson

Moh*_*ani 6 python arrays algorithm swap

我正在学习Codility Counting Lesson(https://codility.com/media/train/2-CountingElements.pdf),我需要帮助才能理解最快的解决方案.

我想知道为什么差异在第8行除以2 d //= 2?难道差异不足以找到我们可以在数组之间交换的元素吗?

问题:

您将得到一个整数m(1 < m < 1000000)和两个非空,零索引的数组ABn整数a0,a1,..., an?1b0,b1...,bn?1分别为(0 < ai,bi < m).目标是检查是否存在可以在这些数组上执行的交换操作,使得数组中的元素A总和等于B交换后数组中元素的总和.通过交换操作,我们的意思是,从采摘数组一个元素A的数组一个元素,并B与他们交流.

解决方案:

 def fast_solution(A, B, m):
   n = len(A)
   sum_a = sum(A)
   sum_b = sum(B)
   d = sum_b - sum_a
   if d % 2 == 1:
       return False
   d //= 2
   count = counting(A, m)
   for i in xrange(n):
       if 0 <= B[i] - d and B[i] - d <= m and count[B[i] - d] > 0:
           return True
   return False
Run Code Online (Sandbox Code Playgroud)

Ale*_*lli 8

之间的交换A[i]和B[j]添加B[j]-A[i]sum(A)减去从相同的值sum(B); 因此它会影响两次 总和的差异B[j]-A[i].

因此,将原始差异减半(在检查它的偶数之后 - 如果奇怪,没有交换将起作用! - )以形成可能交换的目标是正确的.

还要注意counting它们提供的功能不是最佳的现代Python - 为了避免重新发明"计算项目"的特定轮子,请参阅https://docs.python.org/2/library/collections.html#collections.Counter for Python 2,或https://docs.python.org/3/library/collections.html#collections.Counter for Python 3.

  • `因此,将原始差异减半是正确的(在检查它之后是正确的 - 如果它很奇怪没有交换将起作用! - )`如果差异是奇数,为什么完全交换不起作用? (3认同)
  • `很容易证明,如果总和之间的差异是奇数,那么总和也是奇数` - 是的,我可以证明这一点。但它如何使它变得不可能? (2认同)
  • @dhblah,如果`sum(A)+ sum(B)`是奇数,假设交换不能改变这个和的总和,你想要什么值来均衡总和?它必须是奇数除以2,例如非整数分数,但这不可能发生,因为A和B的所有项都是整数.这不是一个编程问题,只是一个简单的逻辑和算法,所以如果你仍然看不到它,请把它带到math.stackexchange.com. (2认同)