当前位置: 首页 > ds >正文

leetcode 239. 滑动窗口最大值

暴力解法是一种简单直接的方法,虽然效率较低,但可以帮助你更好地理解问题的逻辑。以下是使用暴力解法解决“滑动窗口最大值”问题的 C++ 实现。

暴力解法的思路

  1. 遍历每个滑动窗口:

    • 使用一个外层循环,从数组的起始位置开始,逐步移动窗口的起始位置。
    • 每次移动一个位置,形成一个新的滑动窗口。
  2. 找到当前窗口的最大值:

    • 使用一个内层循环,遍历当前窗口内的所有元素,找到最大值。
  3. 存储最大值:

    • 将当前窗口的最大值存储到结果数组中。
  4. 终止条件:

    • 当窗口的右边界超出数组范围时,停止遍历。

C++ 代码实现

#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:vector<int> maxSlidingWindow(vector<int>& nums, int k) {vector<int> result;int n = nums.size();// 遍历每个滑动窗口for (int i = 0; i <= n - k; ++i) {int maxNum = INT_MIN; // 初始化当前窗口的最大值为最小整数// 遍历当前窗口内的所有元素for (int j = i; j < i + k; ++j) {maxNum = max(maxNum, nums[j]); // 更新最大值}// 将当前窗口的最大值加入结果数组result.push_back(maxNum);}return result;}
};

代码解释

  1. 外层循环:

    • for (int i = 0; i <= n - k; ++i):遍历每个可能的滑动窗口的起始位置 i
    • i 的范围是从 0n - k,确保窗口的右边界不超过数组的大小。
  2. 内层循环:

    • for (int j = i; j < i + k; ++j):遍历当前窗口内的所有元素。
    • maxNum = max(maxNum, nums[j]):更新当前窗口的最大值。
  3. 存储最大值:

    • result.push_back(maxNum):将当前窗口的最大值加入结果数组。
  4. 返回结果:

    • 最终返回结果数组 result

时间复杂度

  • 外层循环: 遍历每个可能的滑动窗口,时间复杂度是 O(n - k + 1)
  • 内层循环: 每个窗口内遍历 k 个元素,时间复杂度是 O(k)
  • 总时间复杂度: O((n - k + 1) * k),即 O(n * k)

空间复杂度

  • 结果数组: 存储每个窗口的最大值,空间复杂度是 O(n - k + 1)

示例运行

假设输入数组是 [1,3,-1,-3,5,3,6,7],窗口大小是 k = 3

  • 第一个窗口 [1,3,-1],最大值是 3
  • 第二个窗口 [3,-1,-3],最大值是 3
  • 第三个窗口 [-1,-3,5],最大值是 5
  • 第四个窗口 [-3,5,3],最大值是 5
  • 第五个窗口 [5,3,6],最大值是 6
  • 第六个窗口 [3,6,7],最大值是 7

最终结果是 [3,3,5,5,6,7]

总结

暴力解法虽然简单易懂,但效率较低,适合小规模数据。对于大规模数据,建议使用双端队列的优化方法,时间复杂度可以优化到 O(n)。如果你对暴力解法还有任何疑问,或者想了解更多优化方法,随时问我哦!

http://www.xdnf.cn/news/7012.html

相关文章:

  • MySQL初阶:sql事务和索引
  • 电子电路:什么是高频电路以及都有哪些应用?
  • 手机打电话时由对方DTMF响应切换多级IVR语音应答(二)
  • UDP的单播组播与广播
  • 使用 Python 打造一个强大的文件系统结构创建器
  • 前脚收购 Windsurf 后,OpenAI 深夜发布 Codex。
  • 基于Yolov8+PyQT的老人摔倒识别系统源码
  • 计算机视觉与深度学习 | Python实现EMD-CNN-LSTM时间序列预测(完整源码、数据、公式)
  • 基于CentOS7制作OpenSSL 1.1的RPM包
  • Webpack DefinePlugin插件介绍(允许在编译时创建JS全局常量,常量可以在源代码中直接使用)JS环境变量
  • HarmonyOS:重构万物互联时代的操作系统范式
  • 6.1.1图的基本概念
  • 在宝塔中使用.NET环境管理部署 .NET Core项目
  • GO语言语法---if语句
  • VSCode launch.json 配置参数详解
  • 软件调试纵横谈-17-win32堆的调试支持
  • Android开发——轮播图引入
  • Redis设计与实现——Redis命令参考与高级特性
  • impala
  • 基于KAN+Transformer的专业领域建模方法论
  • 【滑动窗口】LeetCode 1658题解 | 将 x 减到 0 的最小操作数
  • day28 python 类与继承
  • EXO 可以将 Mac M4 和 Mac Air 连接起来,并通过 Ollama 运行 DeepSeek 模型
  • Ansible模块——服务管理和设置定时任务
  • 中药药效成分群的合成生物学研究进展-文献精读130
  • json schema校验json字符串(networknt/json-schema-validator)
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色QColor)
  • Java-反射(Reflection)
  • Power BI Desktop开发——矩阵相关操作
  • 智慧校园(含实验室)智能化专项汇报方案