“假设你有一条路(或数字线),头上的灯照亮了一段数字线。灯光由一个2D阵列表示,索引I处的光线包括从arri到arri (包括)。
你也会得到这条线上点的列表,对于每一个点,你想要计算出有多少灯光照亮了这个点。我想返回一个列表,其中listi =照亮点I的灯数。“
示例输入/输出:lights = [[1, 7], [5, 11], [7, 9]], points = [7, 1, 5]
应该返回[3, 1, 2]
我编写了一个解决方案,在该解决方案中,对于点中的每一个点,您可以在灯阵列上循环,并查看有多少个点具有<=点<=光点。这个解太慢(为O(n *k),其中n= num。灯和k= num。))。我也试着把灯分类,当兰皮点的时候就断了,但还是超时了。有人能想到一个更快的算法来计算这个数组吗?我很难找到其他的方法来解决这个问题。
发布于 2022-10-04 15:15:38
这个问题最好这样解决:
然后,
。
中这样做
执行情况:
from bisect import bisect
def solve(lights, points):
pairs = sorted((x + i, -i or 1) for changes in lights for i, x in enumerate(changes))
offsets, changes = zip(*pairs)
total = 0
cumul = [0] + [total := total + change for change in changes]
return [cumul[bisect(offsets, x)] for x in points]
lights = [[1, 7], [5, 11], [7, 9]]
points = [7, 1, 5]
print(solve(lights, points)) # [3, 1, 2]
这是移除重复项的版本。只有当cumul
列表中确实存在许多重复的抵消时,才会有好处:
def solve(lights, points):
pairs = sorted((x + i, -i or 1) for changes in lights for i, x in enumerate(changes))
total = 0
cumulpairs = [(x, total := total + change) for x, change in pairs]
# remove duplicates - assuming Python 3.7+ with ordered dicts
offsets, cumul = zip(*dict(cumulpairs).items())
cumul = [0] + list(cumul)
return [cumul[bisect(offsets, x)] for x in points]
https://stackoverflow.com/questions/73948161
复制相似问题