2
下面是Java中Sliding Window Maximum問題的示例解決方案。這個函數的時間複雜度是多少?
給定一個數組nums,有一個大小爲k的滑動窗口,它從數組的最左邊移動到最右邊。您只能在窗口中看到 的k個數字。滑動窗口每次移動 向右移動一個位置。
我想獲得這個功能的時間和空間的複雜性。這是我覺得這是答案:
時間:O((n-k)(k * logk))
== O(nklogk)
空間(輔助):O(n)
退貨int[]
和O(k)
爲pq
。共有O(n)
。
這是正確的嗎?
private static int[] maxSlidingWindow(int[] a, int k) {
if(a == null || a.length == 0) return new int[] {};
PriorityQueue<Integer> pq = new PriorityQueue<Integer>(k, new Comparator<Integer>() {
// max heap
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
int[] result = new int[a.length - k + 1];
int count = 0;
// time: n - k times
for (int i = 0; i < a.length - k + 1; i++) {
for (int j = i; j < i + k; j++) {
// time k*logk (the part I'm not sure about)
pq.offer(a[j]);
}
// logk
result[count] = pq.poll();
count = count + 1;
pq.clear();
}
return result;
}
'k'確實是一個常數? – Boggartfly
如果k不是常數,那麼如何從等式'O((n-k)(k * logk))'中消除? – Boggartfly