繁体   English   中英

我应该使用哪种算法来优化代码?

[英]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

注意:查询不是彼此独立的。

INPUT:

  1. 第一行包含N(数组中的元素数)和Q(查询数)
  2. 第二行包含N个空格分隔的整数
  3. Q空间分隔的整数,表示每个查询中的选定索引

5 2 
4 3 4 3 2
3 2

输出:

4 3 4 0 0

说明:

  1. 第一个查询后的数组:{4,3,4,3,0}
  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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM