239. 滑动窗口最大值

题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值 。

解题思路

#![allow(unused)]
fn main() {
struct Solution {}
impl Solution {
    pub fn max_sliding_window(v: Vec<i32>, k: i32) -> Vec<i32> {
        let k = k as usize;
        let n = v.len();
        let mut res = vec![];
        let mut q = std::collections::VecDeque::new();
        for i in 0..n {
            if i >= k && v[i - k] == q[0] {
                q.pop_front();
            }
            // add last
            while let Some(&x) = q.back() {
                if x < v[i] { q.pop_back(); }
                else { break }
            }
            q.push_back(v[i]);
            if i >= k - 1 {
                res.push(q[0]);
            }
        }
        res
    }
}
}

学习感想

一开始确实以为大顶堆就行了,其实要用单调栈,之前也有做过单调栈的题目

单调队列是不能够删除一个指定的元素的,单调栈里维护需要的最大值

#![allow(unused)]
fn main() {
struct Solution {}
impl Solution {
    pub fn max_sliding_window(nums: Vec<i32>, k: i32) -> Vec<i32> {
        use std::collections::VecDeque;
        let mut v: VecDeque<i32> = VecDeque::new();
        let k: usize = k as usize;
        let mut res: Vec<i32> = vec![];
        for idx in 0 .. nums.len() {
            if idx >= k  {
                let to_delete: i32 = nums[idx - k];
                if to_delete == v[0] { v.pop_front(); }
            }
            let cur: i32 = nums[idx];
            while let Some(&bck) = v.back() {
                if bck < cur {
                    v.pop_back();
                } else { break }
            }
            v.push_back(cur);
            if idx >= k - 1 { res.push(v[0]); }
        }
        res
    }
}
}