前言:
而今兄弟们对“优先函数怎么求最大值”可能比较讲究,大家都需要知道一些“优先函数怎么求最大值”的相关文章。那么小编在网摘上网罗了一些对于“优先函数怎么求最大值””的相关资讯,希望大家能喜欢,咱们快快来了解一下吧!题目要求:
给你一个整数数组,有一个大小为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; }
版权声明:
本站文章均来自互联网搜集,如有侵犯您的权益,请联系我们删除,谢谢。
标签: #优先函数怎么求最大值