我给了两个数组 a [n] , b [n] ,其中n可以是 10 ^ 5
最初 answer 数组的大小为 n ,其中包含所有零。
任务是将 a [i] , b [i] 作为 answer [i] 的间隔,并增加它们之间的值由 1 。
示例:
+ array.Length
所以回答(i + shift % array.Length + array.Length) % array.Length
a[n] = {1,1,1,1,1};
b[n] = {3,3,5,5,5};
始终大于[n] = {5, 5, 5, 3, 3}
我已经在n ^ 2中使用bruteforce完成了此操作
b[i]
还有什么更好的方法可以在 线性时间 中解决此问题。
答案 0 :(得分:0)
是的,可以做到。而不是对整个范围执行增大操作,而是选择要增大范围的起始索引,而要减小最后一个索引+1。
在起始索引处添加数字,然后从end_index + 1中减去该数字。如果仔细观察,结果是相同的。
最后找到前缀子数组sum,这就是答案。
def increment(a,b,n):
answer = [0]*(n+1)
for i in range(n):
lowerbound = a[i]
upperbound = b[i]
answer[lowerbound] += 1
if upperbound < n:
answer[upperbound+1] -= 1
for i in range(2,n+1):
answer[i] += answer[i-1]
answer = answer[1:]
print(answer)