了解面试必会算法Sliding Window 模式的前世今生

2024-01-24 04:20

本文主要是介绍了解面试必会算法Sliding Window 模式的前世今生,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,今天我们来聊一聊sliding window pattern。又是给有个机会给班花讲题的好机会,不能错过!
在这里插入图片描述

Sliding Window Pattern,中文名字叫滑动窗口模式,是一种常见的算法思想。它可以用来解决很多问题,比如:

Sliding Window Pattern 的优缺点

它具有以下优点:

  • 可以有效地解决很多问题:Sliding Window Pattern 可以用于解决很多问题,比如求最大值、最小值、平均值、子串、子序列的长度、最长公共子序列、最长上升子序列等。
  • 时间复杂度较低:Sliding Window Pattern 的一般时间复杂度为 O(n),对于一些特殊问题,时间复杂度甚至可以达到 O(1)。
  • 代码实现简单:Sliding Window Pattern 的代码实现非常简单,只需要维护一个窗口,然后在窗口滑动过程中不断地更新窗口内的值即可。

Sliding Window 算法也存在一些缺点:

  • 需要额外空间:Sliding Window Pattern 需要额外存储窗口内的元素,因此会增加空间复杂度。
  • 适用范围有限:Sliding Window Pattern 并不是所有问题都适用,只有满足特定条件的问题才能使用 Sliding Window Pattern。

怎么样?是不是依然觉得有些不理解,那么上图说话
在这里插入图片描述
L和R指针分别都指向a, R走到b,这时候将a放入HashSet,接下来放入b;因为窗口大小为3,那么R继续向➡️走,走到c,最终将c放入HashSet。
在这里插入图片描述
当然了如何白月光还是觉得这个算法不好记,我们就那个例子让她印象更加深刻吧

我们可以把数组看成一条河流,窗口就像一条船。船从左到右航行,每次经过一个元素,就把这个元素记录下来。当船航行到河流的尽头时,我们就得到了河流中最大值的滑动窗口。

伪代码实现

function sliding_window(array, window_size)# 初始化窗口window = []for i in range(window_size):window.append(array[i])# 滑动窗口for i in range(window_size, len(array)):# 更新窗口window.pop(0)window.append(array[i])# 计算窗口内的值...# 返回窗口内的值return window

在这里插入图片描述

具体用Java语言实现的例子可以参考小白理解Leetcode系列

小白水平理解面试经典题目LeetCode 594 最大和谐字符串

这篇关于了解面试必会算法Sliding Window 模式的前世今生的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/638520

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架