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