Time complexity 这个函数的时间复杂度是多少?

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

下面是一个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) {
    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;
}