力扣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;
    }
}
相关推荐
自然常数e14 分钟前
字符函数和字符串函数
c语言·算法·visual studio
leaves falling22 分钟前
c语言分数求和
算法
Das123 分钟前
【机器学习】01_模型选择与评估
人工智能·算法·机器学习
星轨初途1 小时前
郑州轻工业大学2025天梯赛解题
c++·经验分享·笔记·算法·链表·剪枝
不忘不弃1 小时前
从字符串中提取数字
数据结构·算法
囊中之锥.2 小时前
《机器学习SVM从零到精通:图解最优超平面与软间隔实战》
算法·机器学习·支持向量机
顽强卖力2 小时前
第二章:什么是数据分析师?
笔记·python·职场和发展·学习方法
必胜刻2 小时前
复原 IP 地址(回溯算法)
tcp/ip·算法·深度优先
YGGP3 小时前
【Golang】LeetCode 5. 最长回文子串
算法·leetcode
hqyjzsb3 小时前
从爱好到专业:AI初学者如何跨越CAIE认证的理想与现实鸿沟
大数据·c语言·人工智能·信息可视化·职场和发展·excel·业界资讯