小于n ^ 2的每个元素的出现次数

时间:2019-08-07 14:59:44

标签: java algorithm c++11

我给了两个数组 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]

还有什么更好的方法可以在 线性时间 中解决此问题。

1 个答案:

答案 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)