力扣239. 滑动窗口最大值

Problem: 239. 滑动窗口最大值

文章目录

题目描述

思路

1.编写实现优先队列类:

1.1.实现push(int n) :将元素n添加到队列尾,同时将n前面大于n的元素删除

1.2.实现int max() :将队列头元素取出(由于实现了push所以此时队列头元素为当前队列中的最大值)

1.3.实现pop(int n):将队列头的元素n删除(代码实现中,需要先检查n是否还在当前对头。因为n有可能已经删除掉了)
2.题目代码逻辑实现:
2.1.生成窗口:将前k个元素添加到实现的优先队列中;

2.2.维护窗口:每次push一个新的元素到窗口,再取出当前窗口中的最大值添加到结果集合中,再删除之前的窗口左侧

复杂度

时间复杂度:

O ( n ) O(n) O(n);其中 n n n为数组nums的长度

空间复杂度:

O ( n ) O(n) O(n);

Code

java 复制代码
/* Monotonic queue implementation */
class MonotonicQueue {
    LinkedList<Integer> maxq = new LinkedList<>();

    public void push(int n) {
        // Delete all elements smaller than n
        while (!maxq.isEmpty() && maxq.getLast() < n) {
            maxq.pollLast();
        }
        // Then add n to the tail
        maxq.addLast(n);
    }

    public int max() {
        return maxq.getFirst();
    }

    public void pop(int n) {
        if (n == maxq.getFirst()) {
            maxq.pollFirst();
        }
    }
}

class Solution {
    /***
     * Sliding Window Maximum
     *
     * @param nums Given array
     * @param k Given number
     * @return int[]
     */
    public int[] maxSlidingWindow(int[] nums, int k) {
        MonotonicQueue window = new MonotonicQueue();
        List<Integer> res = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            if (i < k - 1) {
                // Fill the front k-1 of the window first
                window.push(nums[i]);
            } else {
                // The window slides forward to add a new number
                window.push(nums[i]);
                // Record the maximum value of the current window
                res.add(window.max());
                // Remove old numbers
                window.pop(nums[i - k + 1]);
            }
        }
        // Needs to be converted to an int[] array and returned
        int[] arr = new int[res.size()];
        for (int i = 0; i < res.size(); i++) {
            arr[i] = res.get(i);
        }
        return arr;
    }
}
相关推荐
fie88891 天前
NSCT(非下采样轮廓波变换)的分解和重建程序
算法
晨晖21 天前
单链表逆转,c语言
c语言·数据结构·算法
沐雪架构师1 天前
大模型Agent面试精选15题(第四辑)-Agent与RAG(检索增强生成)结合的高频面试题
面试·职场和发展
YoungHong19921 天前
面试经典150题[072]:从前序与中序遍历序列构造二叉树(LeetCode 105)
leetcode·面试·职场和发展
im_AMBER1 天前
Leetcode 78 识别数组中的最大异常值 | 镜像对之间最小绝对距离
笔记·学习·算法·leetcode
鼾声鼾语1 天前
matlab的ros2发布的消息,局域网内其他设备收不到情况吗?但是matlab可以订阅其他局域网的ros2发布的消息(问题总结)
开发语言·人工智能·深度学习·算法·matlab·isaaclab
LYFlied1 天前
【每日算法】LeetCode 25. K 个一组翻转链表
算法·leetcode·链表
Swizard1 天前
别再迷信“准确率”了!一文读懂 AI 图像分割的黄金标尺 —— Dice 系数
python·算法·训练
s09071361 天前
紧凑型3D成像声纳实现路径
算法·3d·声呐·前视多波束
可爱的小小小狼1 天前
算法:二叉树遍历
算法