【发布时间】:2017-09-11 07:59:06
【问题描述】:
以下是 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真的是一个常数吗? -
如果 k 不是常数,你如何从方程
O((n-k)(k * logk))中消除它?
标签: time-complexity big-o