Time complexity 这个函数的时间复杂度是多少?
下面是一个Java问题的示例解决方案 给定一个数组nums,有一个大小为k的滑动窗口 从阵列的最左侧移动到最右侧。你只能 查看窗口中的k编号。每次滑动窗口移动时 正好一个位置 我想得到这个函数的时间和空间复杂度。我认为答案如下: 时间:Time complexity 这个函数的时间复杂度是多少?,time-complexity,big-o,Time Complexity,Big O,下面是一个Java问题的示例解决方案 给定一个数组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) { i
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;
}
private static int[]maxSlidingWindow(int[]a,int k){
如果(a==null | | a.length==0)返回新的int[]{};
PriorityQueue pq=新的PriorityQueue(k,新的比较器(){
//最大堆
公共整数比较(整数o1,整数o2){
返回o2-o1;
}
});
int[]结果=新的int[a.length-k+1];
整数计数=0;
//时间:n-k次
对于(int i=0;i
除了-
for (int j = i; j < i + k; j++) {
// time k*logk (the part I'm not sure about)
pq.offer(a[j]);
}
第二个想法是,您可以比使用双端队列属性的线性时间解决方案做得更好,它将是O(n)
。这是我的解决方案-
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || k <= 0) {
return new int[0];
}
int n = nums.length;
int[] result = new int[n - k + 1];
int indx = 0;
Deque<Integer> q = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
// remove numbers out of range k
while (!q.isEmpty() && q.peek() < i - k + 1) {
q.poll();
}
// remove smaller numbers in k range as they are useless
while (!q.isEmpty() && nums[q.peekLast()] < nums[i]) {
q.pollLast();
}
q.offer(i);
if (i >= k - 1) {
result[indx++] = nums[q.peek()];
}
}
return result;
}
public int[]最大滑动窗口(int[]nums,int k){
如果(nums==null | | k=k-1){
结果[indx++]=nums[q.peek()];
}
}
返回结果;
}
HTH.k真的是常数吗?如果k不是常数,你怎么能从方程
O((n-k)(k*logk))
?
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || k <= 0) {
return new int[0];
}
int n = nums.length;
int[] result = new int[n - k + 1];
int indx = 0;
Deque<Integer> q = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
// remove numbers out of range k
while (!q.isEmpty() && q.peek() < i - k + 1) {
q.poll();
}
// remove smaller numbers in k range as they are useless
while (!q.isEmpty() && nums[q.peekLast()] < nums[i]) {
q.pollLast();
}
q.offer(i);
if (i >= k - 1) {
result[indx++] = nums[q.peek()];
}
}
return result;
}