代码随想录算法训练营第十一天-239.滑动窗口最大值

news/2024/12/22 20:46:11 标签: 算法, c++
  • 解题思想与代码实现,令人叹为观止
  • 队列的最佳应用
  • 从总体上讲,完成代码的思路是非常清晰的
    • 根据窗口大小,从源数据第一个开始,把数据依次压入队列中
    • 从压入队列的数据中找出最大值,放入结果集合中
    • 再将队列中第一个元素弹出,从尾部压入下一个元素,然后再找出当前队列中的最大值,放入结果集合中
    • 如此反复,直到最后一个元素
  • 双端队列的性质的应用
    • 滑动窗口最多放入的数据不超过窗口长度
    • 队列中的最前面的元素就是当前队列的最大值
      • 保证最大值在队列最前面的前提是,当数据被压住队列时,把比压入数据小的,且排在队列前面的元素全都弹出队列
      • 在循环压入数据过程中,正常是应该把队列中最前面元素弹出,但由于上一步已有把小的元素弹出队列的操作,所以这一步弹出队列第一个元素的操作可能是虚晃一枪,因为可能不需要真实删除元素,只是在有必要时才进行弹出操作
#include <iostream>
#include <vector>
#include <deque>

class SlidingWindowDes {
private:    
    std::deque<int> que;
public:
    void pop(int value) {
        if (!que.empty() && que.front() == value)
            que.pop_front();
    }
    void push(int value) {
        while (!que.empty() && value > que.back())
            que.pop_back();
        que.push_back(value);
    }
    int getFront() {
        return que.front();
    }

};

class Solution {
public:
    std::vector<int> maxSlidingWindow(std::vector<int>& nums, int k) {
        SlidingWindowDes swd;
        std::vector<int> vec_result;
        for (int i = 0; i < k; i++)
            swd.push(nums.at(i));
        vec_result.push_back(swd.getFront());
        for (int i = k; i < nums.size(); ++i) {
            swd.pop(nums.at(i - k));
            swd.push(nums.at(i));
            vec_result.push_back(swd.getFront());
        }
        return vec_result;
    }
};

int main()
{
    std::vector<int> nums {1, 3, -1, -3, 5, 3, 6, 7};
    Solution s;
    std::vector<int> ret = s.maxSlidingWindow(nums, 3);
    for (int e: ret)
        std::cout << e << " ";
    std::cout << std::endl;
    return 0;
}
  • 汇总

http://www.niftyadmin.cn/n/5795842.html

相关文章

保姆级教程Docker部署RabbitMQ镜像

目录 1、创建挂载目录 2、运行RabbitMQ容器 3、Compose运行RabbitMQ容器 4、开启界面插件 5、查看RabbitMQ运行状态 6、常见问题处理 1、创建挂载目录 # 创建宿主机rabbitMQ挂载目录 sudo mkdir -p /data/docker/rabbitmq/log# 修改log目录权限 sudo chmod 777 /data/do…

HTML 新手易犯的标签属性设置错误

滥用target"_blank"属性&#xff1a;将所有链接的目标设为_blank会在新标签页中打开链接&#xff0c;这可能会导致用户在不知情的情况下打开大量新标签页&#xff0c;影响用户体验。正确的做法是只在需要新标签页打开的链接上使用该属性&#xff0c;并在标签中添加适…

在UE5中调用ImGui图形界面库

ImGui是一个小巧灵活、简洁美观的图形界面库 首先我们直接参考Github https://github.com/SLSNe/Unreal5-ImGui 把项目下载下来后 打开项目目录或者引擎目录 项目根目录/Plugins/ImGui/ 或 UE5引擎根目录/Engine/Plugins/ 如果没有Plugins文件夹就新建一个 把项目放里面…

CentOS 7 安装、测试和部署FastDFS

目录 FastDFS环境搭建 安装 libfastcommon 库 安装FastDFS 查看编译后的文件 FastDFS配置 FastDFS启动 启动tracker服务 启动storage服务 查看storage是否已经注册到了tracker下 查看存储文件的目录 FastDFS重启 FastDFS关闭 使用fdfs_test进行测试 修改client.co…

MongoDB 介绍及 Java 实现基本操作

MongoDB 介绍及 Java 实现基本操作 一、MongoDB 简介二、Java 操作 MongoDB 的基本步骤1. 环境准备2. 基本操作示例 三、代码解析1. 连接 MongoDB&#xff1a;通过 MongoClients.create(uri) 创建客户端连接&#xff0c;uri 指定 MongoDB 服务地址。2. 获取数据库和集合&#x…

c语言进程直接的管道

无名管道 #include<myhead.h> int main(int argc, const char *argv[]) {int pipfd[2];char buff[1024]"hello world";char s[1024];//创建无名管道if(pipe(pipfd)-1){perror("pipe");return -1;}int pidfork();if(pid-1){perror("fork"…

git merge 冲突 解决 show case

废话不多说&#xff0c;上 case&#xff01;&#xff01;&#xff01; 1. 更新master分支 package org.example;public class Main {public static void main(String[] args) {System.out.println("--------Git冲突测试代码开始---------");System.out.println(&qu…

【VSCode】解决:提取扩展失败,XHR Failed

问题&#xff1a;提取扩展失败&#xff0c;XHR Failed 解决方案一&#xff1a; 在设置中搜索代理/proxy&#xff0c;然后把已有的代理清除&#xff0c;部分时候可以解决问题。 解决方案二&#xff1a; 如果我的代理本来就没有问题&#xff0c;可以直接连接vscode服务器&…