《算法通关村——原来滑动窗口如此简单》

news2025/3/6 21:11:40

《算法通关村——原来滑动窗口如此简单》

基本思想

滑动窗口的思想非常简单,如下图所示,假如窗口的大小是3,当不断有新数据来时,我们会维护一个大小为3的一个区间,超过3的就将新的放入老的移走。

这个过程有点像火车在铁轨上跑,原始数据可能保存在一个很大的空间里(铁轨),但是我们标记的小区间就像一列长度固定的火车,一直向前走。

有了区间,那我们就可以造题了,例如让你找序列上三个连续数字的最大和是多少,或者子数组平均数是多少(LeetCode643)等等。

在这里插入图片描述

从上面的图可以看到,所谓窗口就是建立两个索引,left和right,并且保持{left,right}之间一共有3个元素,然后一边遍历序列,一边寻找,每改变一次就标记一下当前区间的最大值就行了。

这个例子已经告诉我们了什么是窗口、什么是窗口的滑动:

  • 窗口:窗口其实就是两个变量left和right之间的元素,也可以理解为一个区间。窗口大小可能固定,也可能变化,如果是固定大小的,那么自然要先确定窗口是否越界,再执行逻辑处理。如果不是固定的,就要先判断是否满足要求,再执行逻辑处理。

  • 滑动:说明这个窗口是移动的,事实上移动的仍然是left和right两个变量,而不是序列中的元素。当变量移动的时,其中间的元素必然会发生变化,因此就有了这种不断滑动的效果。

在实际问题中,窗口大小不一定是固定的,我们可以思考两种场景:

  1. 固定窗口的滑动就是火车行驶这种大小不变的移动 。
  2. 可变的窗口就像两个老师带着一队学生外出,一个负责开路,一个负责断后,中间则是小朋友。两位老师之间的距离可能有时大有时小,但是整体窗口是不断滑动的。

根据窗口大小是否固定,可以造出两种类型的题:

  1. 如果是固定的,则一般会让你求哪个窗口的元素最大、最小、平均值、和最大、和最小等等类型的问题。

  2. 如果窗口是变的,则一般会让你求一个序列里最大、最小窗口是什么等等。

练题

643. 子数组最大平均数 I

给你一个由 n 个元素组成的整数数组 nums 和一个整数 k

请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。

任何误差小于 10-5 的答案都将被视为正确答案。

示例 1:

输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75

示例 2:

输入:nums = [5], k = 1
输出:5.00000

提示:

  • n == nums.length
  • 1 <= k <= n <= 105
  • -104 <= nums[i] <= 104
题解

这里直接就用一次遍历就解决问题。大大提高了解决速度,这就是滑动窗口

class Solution {
    public double findMaxAverage(int[] nums, int k) {
        int len = nums.length;
        int windowSum = 0;
        if(k > nums.length || nums.length < 1 || k<1){
            return 0;
        }
        for(int i = 0;i<k;i++){
            windowSum += nums[i];
        }

        int res = windowSum;
        for(int i = k;i< nums.length;i++){
            windowSum += nums[i] - nums[i - k];
            res = Math.max(res,windowSum);
        }
        return (double) res / k;
    }
}

674. 最长连续递增序列

给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。

连续递增的子序列 可以由两个下标 lrl < r)确定,如果对于每个 l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是连续递增子序列。

示例 1:

输入:nums = [1,3,5,4,7]
输出:3
解释:最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。 

示例 2:

输入:nums = [2,2,2,2,2]
输出:1
解释:最长连续递增序列是 [2], 长度为1。

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109
题解

有两种,其实思想都差不多,一个使用一个变量来记录当前递增区间值,一个则是维护左右区间而已

class Solution {
    public int findLengthOfLCIS(int[] nums) {
        // int maxLength = 1;
        // int left = 0,right = 1;
        // int tempLength = 1;
        // for(;right<nums.length;right++){
        //     if(nums[right] > nums[right-1]){
        //         tempLength++;
        //         if(right == nums.length - 1){
        //             maxLength = Math.max(maxLength,tempLength);
        //         }
        //     }else{
        //         maxLength = Math.max(maxLength,tempLength);
        //         tempLength = 1;
        //     }
        // }
        // return maxLength;
        int left = 0, right = 0;
        int res = 0;
        while( right < nums.length){
            if(right > 0&& nums[right-1] >= nums[right]){
                left = right;
            }
            right ++;
            res = Math.max(res,right - left);
        }
        return res;
    }
}

可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

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

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

相关文章

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示功能菜单应用

基于STC12C5A60S2系列1T 8051单片机的液晶显示器LCD1602显示功能菜单应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示器LCD1602简单介绍IIC通信简单介绍掉…

将不同时间点的登录状态记录转化为不同时间段的相同登录状态SQL求解

题目 有不同时间点的登录状态记录表state_log如下 请使用sql将其转化为如下表的不同时间段的相同登录状态记录 思路分析&#xff1a; 此类问题需要用到lag或lead函数取上下行对应的数据&#xff0c;然后对前后结果做比较打标签&#xff08;0或1&#xff09;&#xff0c;再…

一文带你了解智能汽车车载网络通信安全架构2023-01-05

本文从汽车车载网络信息安全的角度出发&#xff0c;提出一种汽车车载网络通信安全架构方案&#xff0c;该方案通过构建多域分层入侵检测模型&#xff0c;实现预防—检测—预警的完整安全防护体系。 目前&#xff0c;智能化、网联化、电动化是汽车发展的大趋势&#xff0c;各大…

嵌入式 C 语言中的全局变量问题

大家好&#xff0c;今天分享一篇关于嵌入式C编程中全局变量问题的文章。希望对大家有所启发。 嵌入式特别是单片机os-less的程序&#xff0c;最易范的错误是全局变量满天飞。 这个现象在早期汇编转型过来的程序员以及初学者中常见&#xff0c;这帮家伙几乎把全局变量当作函数形…

vue 前端实现login页登陆 验证码

实现效果 // template <el-form :model"loginForm" :rules"fieldRules" ref"loginForm" label-position"left" label-width"0px" class"login-container"><span class"tool-bar"></sp…

02.PostgreSQL 查询处理期间发生了什么?

PostgreSQL 查询处理期间发生了什么&#xff1f; 文中主要内容引用自PostgreSQL指南&#xff1a;内幕探索 查询处理是PostgreSQL中最为复杂的子系统。如PostgreSQL官方文档所述&#xff0c;PostgreSQL支持SQL2011标准中的大多数特性&#xff0c;查询处理子系统能够高效地处理这…

uniapp-从后台返回的一串地址信息上,提取省市区进行赋值

1.这是接口返回的地址信息 2.要实现的效果 3.实现代码&#xff1a; <view class"address">{{item.address}}</view>listFun() {let url this.$url.url.positionInfoCompany;let param {page: this.page,limit: this.limit,keyword: this.keyword,};thi…

【概率统计】如何理解概率密度函数及核密度估计

文章目录 概念回顾浅析概率密度函数概率值为0&#xff1f;PDF值大于1&#xff1f;一个栗子 核密度估计如何理解核密度估计核密度估计的应用 总结 概念回顾 直方图&#xff08;Histogram&#xff09;&#xff1a;直方图是最直观的一种方法&#xff0c;它通过把数据划分为若干个区…

LINUX 嵌入式C编程--信号编程

基本概念 信号是事件发生时对进程的通知机制&#xff0c;也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程&#xff0c;其实是在软件层次上对中断机制的一种模拟。信号提供了一种处理异步事件的方法。 信号目的 **信号的目的是用来通信…

基于深度学习的肺炎CT图像检测诊断系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在肺炎CT图像检测诊断方面具有广泛的应用前景。以下是关于肺炎CT图像检测诊断系统的介绍&#xff1a; 任务…

正确理解MySQL的MVCC及实现原理

&#xff01;首先声明&#xff0c;MySQL 的测试环境是 5.7 MVCC是MySQL实现RC(读已提交)、RR(可重复读)隔离级别的原理之一。 前提概要 什么是 MVCC 什么是当前读和快照读&#xff1f; 当前读&#xff0c;快照读和 MVCC 的关系 MVCC 实现原理 隐式字段 undo日志 Read Vie…

【linux】信号——信号保存+信号处理

信号保存信号处理 1.信号保存1.1信号其他相关概念1.2信号在内核中的表示 2.信号处理2.1信号的捕捉流程2.2sigset_t2.3信号集操作函数2.4实操2.5捕捉信号的方法 3.可重入函数4.volatile5.SIGCHLD信号 自我名言&#xff1a;只有努力&#xff0c;才能追逐梦想&#xff0c;只有努力…

C/C++---------------LeetCode第876. 链表的中间结点

链表的中间结点 题目及要求双指针在main内使用 题目及要求 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 示例 2&#xff1a; 双指针 思路&#xff1a;分别定义快慢指针…

2023.11.30 关于 MyBatis 动态 SQL 的使用

目录 引言 if 标签 trim 标签 where 标签 set 标签 foreach 标签 引言 动态 sql 是 MyBatis 的强大特性之一允许你根据输入的参数动态地构建 sql 语句从而在运行时根据不同的条件生成不同的 sql 核心思想 基于提供的数据和条件&#xff0c;能够修改、增加、删除 sql…

canvas 凸包效果

前言 微信公众号&#xff1a;前端不只是切图 代码运行的最终效果在文章最后 什么是凸包 本篇文章主要阐述如何在canvas上实现凸包的效果&#xff0c;我们先来看看下什么是凸包&#xff0c;先上附图 从上面的图可以看出&#xff0c;图中的内容包含点p0-点p12&#xff0c;而红框部…

企业网盘在医疗行业资料管理中的应用与优势

随着企业网盘的广泛应用&#xff0c;医疗行业正逐渐实现资料安全存储和智能化管理。海量应用的推动下&#xff0c;医院管理正朝着线上化、智能化发展迈进。然而&#xff0c;医疗行业仍面临着诸多挑战。 医疗行业的痛点在于病例、档案、药品资料繁多且保存周期长。这些资料的整理…

读书笔记:《Effective Modern C++(C++14)》

Effective Modern C&#xff08;C14&#xff09; GitHub - CnTransGroup/EffectiveModernCppChinese: 《Effective Modern C》- 完成翻译 Deducing Types 模版类型推导&#xff1a; 引用&#xff0c;const&#xff0c;volatile被忽略数组名和函数名退化为指针通用引用&#…

抓取检测(Grasp Dection)

抓取检测 抓取检测被定义为能够识别任何给定图像中物体的抓取点或抓取姿势。抓取策略应确保对新物体的稳定性、任务兼容性和适应性&#xff0c;抓取质量可通过物体上接触点的位置和手的配置来测量。为了掌握一个新的对象&#xff0c;完成以下任务&#xff0c;有分析方法和经验…

第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间

文章目录 第二十二章 指定元素和属性的命名空间 - 指定被视为Global元素的对象的命名空间指定被视为Global元素的对象的命名空间指定映射为元素的属性的命名空间案例1&#xff1a;属性被视为本地元素案例2:属性被视为Global元素 第二十二章 指定元素和属性的命名空间 - 指定被视…

以热爱的态度对待生活,就是最自己的温柔

粉色系拼接款羽绒服 90白鸭绒&#xff0b;连帽立领设计 防风又保暖&#xff0c;柔软蓬松舒适感十足 衣服上加了时尚的字母印花元素 袖口做了魔术贴设计 下摆也做了可调节抽绳 防风保暖五部做到实处哦 宽松版型&#xff0c;很耐穿保暖性又很强 简单大方&#xff0c;搭配…