龙空技术网

算法之滑动窗口最大值

无涯子Z 74

前言:

而今兄弟们对“优先函数怎么求最大值”可能比较讲究,大家都需要知道一些“优先函数怎么求最大值”的相关文章。那么小编在网摘上网罗了一些对于“优先函数怎么求最大值””的相关资讯,希望大家能喜欢,咱们快快来了解一下吧!

题目要求:

给你一个整数数组,有一个大小为k的滑动窗口从数组的最左侧移动到最右侧,第次只能看到窗口元素。

窗口每次只移动一位,返回窗口最大值。

解题思路:

方法一:优先队列。求最大值,可以用优先队列(堆),用来实时维护一系列元素中的最大值。初始化一个优先队列,先把k个元素插入到队列中。队列中存储数组(nums[i],i)当窗口移动时,把新元素插入到队列中,此时堆顶元素为最大值,窗口左侧的元素(i-k)需要从队列中删除。

时间复杂度分析:遍历数组时间复杂度为O(n),优先队列操作时间复杂度为O(logk),整体时间复杂度为O(nlogk)

代码如下:

public int[] maxSlidingWindow(int[] nums, int k) {        // 判断nums是否为空        if (nums == null || nums.length == 0) {            return nums;        }        // 定义优先级队列,定义对比规则        PriorityQueue<int[]> priorityQueue = new PriorityQueue<>(new Comparator<int[]>() {            @Override            public int compare(int[] o1, int[] o2) {                return o1[0] != o2[0] ? o2[0] - o1[0] : o2[1] - o2[1];            }        });        // 初始化k个元素        for (int i = 0; i < k; i++) {            priorityQueue.offer(new int[]{nums[i], i});        }        int n = nums.length;        int[] ans = new int[n - k + 1];        ans[0] = priorityQueue.peek()[0];        // 遍历数组        for (int i = k; i < n; i++) {            priorityQueue.offer(new int[]{nums[i], i});            // 如果下标小于i-k时,说明元素已不在窗口中,直接从队列中删除            if (priorityQueue.peek()[1] <= i - k) {                priorityQueue.poll();            }            ans[i - k + 1] = priorityQueue.peek()[0];        }        return ans;    }

标签: #优先函数怎么求最大值