解题利器:滑动窗口算法详解与应用示例【滑动窗口】

在解决算法问题时,有时我们会面对需要求解 固定大小连续 子数组的和或平均数的情况。这类问题通常可以通过滑动窗口算法高效解决。

滑动窗口算法详解

滑动窗口算法是一种在数组或字符串上求解子数组或子串问题的有效技术。它通过维护一个窗口(通常是一个子数组或子串),在这个窗口上滑动并在每个位置计算所需的结果。这种方法常常可以将暴力解法的时间复杂度从 O ( n 2 ) O(n^2) O(n2) 降低到 O ( n ) O(n) O(n),大大提高了算法的效率。

解决思路

1. 初始化阶段

首先,我们需要初始化一个窗口来计算初始状态下的和或其他需求。例如,在求解长度为 k 的连续子数组的最大平均数时,我们可以先计算前 k 个元素的和作为初始窗口的状态。

// 初始化前 k 个元素的和
double current_sum = 0;
for (int i = 0; i < k; ++i) {current_sum += nums[i];
}
double max_sum = current_sum;

2. 滑动窗口过程

接下来,从索引 k 开始遍历数组,每次移动窗口时,更新窗口的状态。具体操作是减去窗口左边界的元素,并加上窗口右边界的元素。这一步骤可以通过简单的加减操作实现,避免了重复计算整个窗口的开销。

for (int i = k; i < nums.size(); ++i) {current_sum += nums[i] - nums[i - k]; // 更新窗口的和max_sum = max(max_sum, current_sum);  // 更新最大和
}

3. 计算最终结果

最后,通过已经得到的最大和除以 k,即可得到最大平均数。这一步是问题的最终求解步骤。

double max_average = max_sum / k;

应用示例

现在,我们通过一个具体的示例来说明滑动窗口算法的应用。

643. 子数组最大平均数 I - 力扣(LeetCode)

问题描述

给定一个整数数组 nums 和一个整数 k,求长度为 k 的连续子数组的最大平均数。

示例

假设 nums = [1, 12, -5, -6, 50, 3]k = 4

  1. 初始化阶段:

    • 计算前 k 个元素的和:current_sum = 1 + 12 - 5 - 6 = 2
    • 设置 max_sum = current_sum
  2. 滑动窗口过程:

    • 从索引 k = 4 开始,依次计算并更新窗口的和。
    • 在每次更新窗口时,比较并更新 max_sum
  3. 计算最终结果:

    • 最大平均数为 max_average = max_sum / k = 12.75

解决这道题的关键是要找到长度为 k 的连续子数组,使得这个子数组的平均数最大。双层循环的暴力解法会导致时间复杂度过高,无法通过所有测试用例。我们需要使用更高效的方法来解决这个问题。

步骤

  1. 初始化窗口和:计算数组前 k 个元素的和,作为初始窗口的和。
  2. 滑动窗口:从 k 开始,逐步向右滑动窗口。在每一步中,将窗口的右边界元素加入当前窗口和,将窗口的左边界元素移出当前窗口和。
  3. 更新最大和:在每一步中,更新当前窗口和,并记录最大和。
  4. 计算最大平均数:使用最大和除以 k,得到最大平均数。

具体实现

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;class Solution {
public:double findMaxAverage(vector<int>& nums, int k) {ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);// Step 1: Initialize the sum of the first windowdouble current_sum = 0;for (int i = 0; i < k; ++i) {current_sum += nums[i];}double max_sum = current_sum;// Step 2: Slide the window across the arrayfor (int i = k; i < nums.size(); ++i) {current_sum += nums[i] - nums[i - k]; // Update the window summax_sum = max(max_sum, current_sum);  // Update the max sum if current sum is greater}// Step 3: Return the maximum averagereturn max_sum / k;}
};int main() {Solution sol;vector<int> nums = {1, 12, -5, -6, 50, 3};int k = 4;double result = sol.findMaxAverage(nums, k);cout << "The maximum average of a subarray of length " << k << " is: " << result << endl;return 0;
}

详细解释

  1. 初始化

    • current_sum 初始化为前 k 个元素的和。
    • max_sum 初始化为 current_sum
  2. 滑动窗口

    • 从索引 k 开始,遍历数组。
    • 每次更新 current_sum 时,减去窗口左边界的元素,加上窗口右边界的元素。
    • 使用 max 函数更新 max_sum,确保记录的总是最大的窗口和。
  3. 返回结果

    • max_sum 除以 k,得到最大平均数,并返回结果。

优化技巧

在代码中使用以下优化技巧可以提高运行速度:

ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

这几行代码可以加快输入输出速度,适合在需要频繁进行输入输出操作的竞赛环境中使用。

总结

通过以上的步骤,我们成功地使用滑动窗口算法解决了求解最大平均数的子数组问题。滑动窗口算法在处理子数组或子串问题时具有明显的优势,能够有效提高算法的执行效率,是解决类似问题时值得掌握和应用的一种重要技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1489348.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

CAS算法

CAS算法 1. CAS简介 CAS叫做CompareAndSwap&#xff0c;比较并交换&#xff0c;主要是通过处理器的指令来保证操作的原子性。 CAS基本概念 内存位置 (V)&#xff1a;需要进行CAS操作的内存地址。预期原值 (A)&#xff1a;期望该内存位置上的旧值。新值 (B)&#xff1a;如果旧…

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…

(8) ubuntu ROS 安装

文章目录 安装流程1. 进入ros官网2. 根据自己ubuntu系统选择版本&#xff08;我是20.04的ubuntu&#xff09;3.根据流程开始安装3.1 设置sources.list 4.验证ros5.安装rosdep 安装流程 1. 进入ros官网 https://www.ros.org/ 2. 根据自己ubuntu系统选择版本&#xff08;我是2…

排查C++软件异常的常见思路与方法(实战经验总结)

目录 1、概述 2、常用的C++异常排查思路与方法 2.1、IDE调试 2.1.1、Debug和Release下的调试 2.1.2、VS附加到进程调试 2.1.3、Windbg附加到进程调试 2.2、添加日志打印 2.3、分块注释代码 2.4、数据断点 2.5、历史版本比对法 2.6、Windbg静态分析与动态调试 2.6.1…

如何发现快速发现分析生产问题SQL

Performance Schema介绍 Performance Schema提供了有关MySQL服务器内部运行的操作上的底层指标。为了解释清楚Performance Schema的工作机制&#xff0c;先介绍两个概念。 第一个概念是程序插桩&#xff08;instrument&#xff09;。程序插桩在MySQL代码中插入探测代码&#xf…

Hadoop单机版环境搭建

一 . 案例信息 Hadoop 的安装部署的模式一共有三种&#xff1a; 本地模式&#xff0c;默认的模式&#xff0c;无需运行任何守护进程&#xff08; daemon &#xff09;&#xff0c;所有程序都在单个 JVM 上执行。由 于在本机模式下测试和调试 MapReduce 程序较为方便&#x…

鸿蒙开发——axios封装请求、拦截器

描述&#xff1a;接口用的是PHP&#xff0c;框架TP5 源码地址 链接&#xff1a;https://pan.quark.cn/s/a610610ca406 提取码&#xff1a;rbYX 请求登录 HttpUtil HttpApi 使用方法

PHP8.3.9安装记录,Phpmyadmin访问提示缺少mysqli

ubuntu 22.0.4 腾讯云主机 下载好依赖 sudo apt update sudo apt install -y build-essential libxml2-dev libssl-dev libcurl4-openssl-dev pkg-config libbz2-dev libreadline-dev libicu-dev libsqlite3-dev libwebp-dev 下载php8.3.9安装包 nullhttps://www.php.net/d…

基于Qt的视频剪辑

在Qt中进行视频剪辑可以通过多种方式实现&#xff0c;但通常需要使用一些额外的库来处理视频数据。以下是一些常见的方法和步骤&#xff1a; 使用FFmpeg FFmpeg是一个非常强大的多媒体框架&#xff0c;可以用来处理视频和音频数据。你可以使用FFmpeg的命令行工具或者其库来实现…

Github 2024-07-26 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-26统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9HTML项目1TypeScript项目1非开发语言项目1JavaGuide - Java 程序员学习和面试指南 创建周期:2118 天开发语言:Java协议类型:Apache…

springboot使用Gateway做网关并且配置全局拦截器

一、为什么要用网关 统一入口&#xff1a; 作用&#xff1a;作为所有客户端请求的统一入口。说明&#xff1a;所有客户端请求都通过网关进行路由&#xff0c;网关负责将请求转发到后端的微服务 路由转发&#xff1a; 作用&#xff1a;根据请求的URL、方法等信息将请求路由到…

C#初级——枚举

枚举 枚举是一组命名整型常量。 enum 枚举名字 { 常量1, 常量2, …… 常量n }; 枚举的常量是由 , 分隔的列表。并且&#xff0c;在这个整型常量列表中&#xff0c;通常默认第一位枚举符号的值为0&#xff0c;此后的枚举符号的值都比前一位大1。 在将枚举赋值给 int 类型的…

java计算机毕设课设—记账管理系统(附源码和安装视频)

这是什么系统&#xff1f; java计算机毕设课设—记账管理系统&#xff08;附源码和安装视频&#xff09; 记账管理系统主要用于财务人员可以从账务中判断公司的发展方向。对个人和家庭而言&#xff0c;通过记账可以制定日后的 消费计划&#xff0c;这样才能为理财划出清晰合理…

Scrapy 爬取旅游景点相关数据(三)

这一节我们将之前爬取到的景点数据进行解析&#xff0c;并且保存为excel&#xff0c;便于后续使用&#xff0c;本节包含 &#xff08;1&#xff09; 景点数据解析 &#xff08;2&#xff09;数据保存到excel 1 编写爬虫 这次继续改进第二节的爬虫&#xff0c;新建一个爬虫文…

【Java基础】动态代理与代理模式哪些事儿

文章目录 代理静态代理动态代理基于接口的jdk动态的demo源码解析Proxy.newProxyInstancejdk 动态的生成的字节码 基于父类的cglib动态代理源码解析 代理设计模式应用场景 Spring AOP小结 代理 代理其实就是扩展目标对象的功能&#xff0c;比如普通人不具备超人能力&#xff0c…

青少年绘画大赛兰州站:童梦起航 致敬科学 续写降压0号之父强国梦

2024年7月21日&#xff0c;“鹤舞童梦致敬科学精神”青少年绘画大赛在兰州隆重启幕。 活动邀请了多位重量级嘉宾担任评委&#xff0c;包括中国美术家协会会员、甘肃省油画协会常务理事马爱兵&#xff0c;兰州交通大学天佑美术馆馆长王欣&#xff0c;以及国家一级美术师蔡晓斌。…

什么是护网?2024护网行动怎么参加?一文详解_护网具体是做啥的

前言 最近的全国护网可谓是正在火热的进行中&#xff0c;有很多网安小白以及准大一网安的同学在后台问我&#xff0c;到底什么是护网啊&#xff1f;怎么参加呢&#xff1f;有没有相关的学习资料呢&#xff1f;在下不才&#xff0c;连夜整理出来了这篇护网详解文章&#xff0c;希…

Linux笔记 --- 基础指令

1.了解命令行 快捷键打开终端&#xff1a;altctrlT 2.入门命令 1&#xff09;cd 切换工作路径&#xff0c;使用时直接在后面写下当前目录下的下级目录即可跳转&#xff0c;也有特殊用法&#xff0c;在此列出 2&#xff09;ls ls 列举当前目录下的内容常见用法有两种&#xff…

若依ruoyi+AI项目二次开发

//------------------------- //定义口味名称和口味列表静态数据 const dishFlavorListSelectref([ {name:"辣度",value:["不辣","微辣","中辣","重辣"]}, {name:"忌口",value:["不要葱","不要…

【PostgreSQL 16】专栏日常

本专栏从 3 个月前开始着手准备&#xff0c;利用周末及节假日的时间来整理。 ldczzDESKTOP-HVJOUVN MINGW64 ~/mypostgres (dev) $ git lg |tee * 7a7f468 - (HEAD -> dev, origin/main, origin/dev, main) 完成服务端编程的初步整理 (6 minutes ago) <Laven Liu> * …