[英]Which algorithm should I use to optimize my code?
我有N个元素的数组A。 我必须在其中执行Q查询。 在每个查询中,我选择一个索引I(从0开始)并执行以下操作
for j = I+1 to N:
if A[j]<A[i]:
A[j]=0
注意:查询不是彼此独立的。
5 2
4 3 4 3 2
3 2
4 3 4 0 0
我尝试了采用O(n * q)的蛮力解决方案。这就是我所做的。
n,q = map(int,input().split())
A = list(map(int,input().split()))
query = list(map(int,input().split()))
for i in range(len(query)):
for j in range(query[i]+1,n):
if A[j]<A[query[i]]:
A[j] = 0
print(A)
我想在小于O(n * q)的情况下做上述问题。 可能吗 。 你能告诉我们使用哪种算法吗?
创建一个大小为N
的辅助数组,如果存在带有值i
的查询,则其每个元素将为1
,否则为0
。
然后,我们可以迭代辅助数组并跟踪存在查询的x[i]
值的最大值 。
在每个步骤上(将其命名为current
),如果该最大值大于当前元素的值,则将该元素更新为0
这意味着存在一个查询,其查询值为p
,其中x[p] > x[current]
因此, x[current]
设置为0
。
这样,我们实现了内存的整体运行时间为O(n + q)
和O(n)
。
让我们来看一个例子:
n = 5
q = 2
x = {4, 3, 4, 3, 2}
q[0] = 3
q[1] = 2
最初,我们的辅助数组a将是a = {0, 0, 0, 0, 0}
。
第一个查询是q[0] = 3
,因此我们更新a[3] = 1
,因为必须将x[3]
之后的所有内容与x[3]
进行比较,并在必要时进行更新。
第二个查询是q[1] = 2
,因此我们更新a[2] = 1
,因为必须将x[2]
之后的所有内容与x[2]
进行比较,并在必要时进行更新。 现在,这与先前的查询重叠,并且为了合并它们并决定是否应将元素更新为0
,我们应取x[2]
和x[3]
的最大值。
最后,我们遍历a
并跟踪作为查询一部分的x
的当前最大值。 如果受任何查询影响 ,我们将x[i]
更新为0
,并且其值小于影响它的查询的最大值。
我的代码是用Java编写的,但我希望它可以自我解释:
int n = in.nextInt(), q = in.nextInt();
int[] x = new int[n];
for (int i = 0; i < n; i++) {
x[i] = in.nextInt();
}
int[] a = new int[n];
while (q-- > 0) {
int i = in.nextInt();
a[i] = 1;
}
int max = 0;
for (int i = 0; i < n; i++) {
if (a[i] == 1) {
max = Math.max(max, x[i]);
}
if (x[i] < max) {
x[i] = 0;
}
}
for (int i = 0; i < n; i++) {
out.print(x[i]);
out.print(' ');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.