【发布时间】:2020-04-10 00:03:45
【问题描述】:
我试图在 Hackerrank 上解决这个问题。 https://www.hackerrank.com/challenges/playing-with-numbers/problem
给定一个整数数组,您必须回答多个查询。每个查询由一个整数 x 组成,执行如下:
- 将 x 添加到数组的每个元素中,为将来的任何查询永久修改它。
- 找出数组中每个元素的绝对值,并在新行上打印绝对值的总和。
有人可以向我解释这个解决方案吗?
我不太明白需要在数组n = bisect_left(arr, -q) 和这一行(Sc[-1] - 2 * Sc[n] + q * (N - 2 * n) 中搜索-q。
from bisect import bisect_left
def playingWithNumbers(arr, queries):
N = len(arr)
res = []
# Calculate cummulative sum of arr
arr = sorted(arr)
Sc = [0]
for x in arr:
Sc.append(x+Sc[-1])
q = 0
for x in queries:
q += x
n = bisect_left(arr, -q)
res.append((Sc[-1] - 2 * Sc[n] + q * (N - 2 * n)))
return res
谢谢
【问题讨论】:
-
这不是您所要求的解决方案。通过二等分进行累积和搜索,而不是通过 x 递增所有元素并找到绝对值的总和......您可以使用提供的示例运行此代码,如您自己所见。
-
是的,它实际上是排行榜的解决方案之一。我尝试运行这段代码,但不完全理解他们为什么使用这些术语和代码的想法。
-
看起来他对数组进行了排序(我不是 Python 人)。但是要解决这个问题,您不需要对数组进行排序,有两个任务,1)将 x 添加到数组的每个元素中,以及 2)无论符号如何,找到所有数组元素的总和。这两个任务可以在一个循环下完成。所以,O(n) 复杂度。
-
@ManojBanik 在 OP 发表评论后,我得到了解决方案,现在正在写一个很长的解释。这是一个正确的解决方案,只是一个聪明的解决方案。 ;) 这两个任务重复了很多次,所以是
O(n*m)天真,上面这个解决方案是O(nlogn)只是因为排序(字面意思是排序 + O(n+m))。
标签: python algorithm search binary-search bisect