与你交谈系列#2

介绍

今天我们将开始概述用于解决各种算法问题的概念。对某个概念的理解可能会给你一个直觉,从哪个角度开始思考潜在的解决方案。

有不同但没有太多的概念。今天我将把你的注意力集中在滑动窗口概念上。

滑动窗口

与你交谈系列#2

滑动窗口的概念比乍一看要复杂一些。我将通过实际例子来证明这一点。现在,请记住,概念性的想法是我们将有一些必须移动的窗口。让我们立即从示例开始吧。

假设您有一个整数数组和预定义的子数组大小。你被要求找到这样一个子数组(又名窗口),其值的总和将是最大的。

array = [1, 2, 3]window_size = 2# conceptuallysubarray_1 = [1, 2] --> sum 3subarray_2 = [2, 3] --> sum 5maximum_sum = 5

嗯,看起来很简单:
(1) 尺寸为 2 的滑动窗
(2) 2 个子数组
(3) 计算每一项的总和(4) 找出它们之间的最大值

让我们实现它吧。

def foo(array: list[int], size: int) -> int:    maximum = float("-inf")    for idx in range(size, len(array)+1):        left, right = idx-size, idx        window = array[left:right]        maximum = max(maximum, sum(window))    return maximum 

嗯,看来我们刚刚有效地使用了滑动窗口的概念。事实上,不完全是。通过了解解决方案的时间复杂度,我们可以得到“证明”。

复杂度为 o(l)*o(w),其中 l 是数组中窗口的数量,w 是窗口中元素的数量。换句话说,我们需要遍历l个窗口,对于每个第l个窗口,我们需要计算w个元素的总和。

这里有什么问题吗?让我们概念性地描述回答问题的迭代。

array = [1, 2, 3, 4]window_size = 3iterations1 2 3 4 5|___|  |___|    |___|  

答案是,即使我们滑动数组,在每次迭代中我们都需要“重新计算”在上一次迭代中已经计算过的 k-1 个元素。

基本上,这种见解应该建议我们提出一个问题:

“有没有办法利用上一步的计算?”

答案是肯定的。我们可以通过将窗口元素的第一个和下一个元素相加和相减来得到窗口元素的总和。让我把这个想法写入代码中。

def foo(array: List[int] = None, size: int = 0) -> int    window_start, max_, window_sum_ = 0, float("-inf"), 0    for window_end in range(len(array)):        if window_end > size - 1:            window_sum_ -= array[window_start]            window_start += 1        window_sum_ += array[window_end]        max_ = max(max_, window_sum_)    return max_assert foo(array=[1, 2, 3, 4], size=3) == 9

在这里我们可能会看到,当我们构造长度为 size 的子数组时,我们开始从窗口总和中减去第一个元素,这使得我们可以重用上一步的计算。

现在,我们可以说我们有效地利用了滑动窗口的概念,同时我们得到了检查时间复杂度的证明,时间复杂度从 o(l*w) 减少到 o(l),其中 l 是我们将滑动的窗口数量。

我想强调的主要思想,滑动窗口概念不仅仅是用特定大小的窗口来切片可迭代对象

让我给你一些问题,我们将学习如何检测问题可能涉及滑动窗口概念以及你到底可以对窗口本身做什么。

问题概述

由于我在这里只讨论概念,因此我会跳过“如何计算窗口内的某些内容”。

问题一

给定一个数组,求其中所有大小为 k 的连续子数组的平均值。

滑动窗口? -连续子数组第一个关键字,这意味着我们应该照顾窗口,它代表一个连续的子数组。我们知道滑动窗口的大小吗? – 是的,k,我们得到了窗口的大小,它应该是 k 的长度。我们到底应该在滑动窗口内管理/检查什么? – 找出…的平均值好,现在我们可以这样定义该方法:使用大小为 k 的窗口迭代输入数组。在每次迭代中计算窗口的平均值…

问题二

给定一个正数数组和一个正数 k,找到大小为 k 的任何连续子数组的最大和。

滑动窗口? – 再次连续子数组,第一个关键字,这意味着我们应该处理窗口,它代表一个连续子数组。我们知道滑动窗口的大小吗? – 是的,k,我们得到了窗口的大小,它应该是 k 的长度。我们到底应该在滑动窗口内管理/检查什么? – .. 总和 …现在:使用大小为 k 的窗口遍历输入数组。在每次迭代中计算窗口的总和…

问题三

给定一个正数数组和一个正数 s,找到总和大于或等于 s 的最小连续子数组的长度。

滑动窗口? – 再次连续子数组,第一个关键字,这意味着我们应该处理窗口,它代表一个连续子数组。我们知道滑动窗口的大小吗? – 其实不,我们需要弄清楚。我们到底应该在滑动窗口内管理/检查什么? – …总和是 >= 到 s …现在,我们可以这样定义该方法:“首先,迭代输入数组并构造这样的第一个窗口,它将满足条件(总和为 >= 到 s)。完成后,移动窗口,管理窗口开始和结束…”

问题四

给定一个字符串,找到其中不超过 k 个不同字符的最长子字符串的长度。

滑动窗口? – 最长的子串,第一个关键字,这意味着我们应该照顾代表子串的窗口。我们知道滑动窗口的大小吗? – 不,我们需要弄清楚。我们到底应该在滑动窗口内管理/检查什么? – …不同字符的数量…这里的方法有点复杂,所以我在这里跳过。

问题五

给定一个整数数组,其中每个整数代表一棵果树,给你两个篮子,你的目标是在每个篮子里放入最大数量的水果。唯一的限制是每个篮子只能放一种水果。

你可以从任何一棵树开始,但一旦开始你就不能跳过一棵树。您将从每棵树上采摘一种水果,直到您无法采摘为止,也就是说,当您必须从第三种水果中采摘时,您将停止。
编写一个函数来返回两个篮子中水果的最大数量。

好像不是那么明显,我们先简化一下条件。

有一个输入数组。数组可能仅包含 2 个不同的数字(桶)。要求你找到长度最大的连续子数组。

现在更容易看出我们可能会使用滑动窗口概念。

滑动窗口? – 连续子数组我们知道滑动窗口的大小吗? – 不,我们需要弄清楚。我们到底应该在滑动窗口内管理/检查什么? – …数字是否不同以及窗口的长度…问题六

给定一个字符串和一个模式,找出该字符串是否包含该模式的任何排列

首先,我们有 2 个字符串,原始字符串和模式字符串。我们知道我们已经以某种方式比较了原始和模式,这导致了这个想法,我们需要构建模式大小的窗口并进一步执行排列检查。这意味着,我们可以使用滑动窗口概念。

尾奏

当您处理滑动窗口时,请记住以下问题:

你了解窗户的尺寸吗你知道如何建造窗户吗你知道如何移动/缩小窗口吗你了解什么是有效/无效窗口吗你知道如何让无效窗口变成有效窗口吗

以上就是与你交谈系列#2的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1348102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
字符串和尾随逗号,耦合并成为,Tuple ():将错误复制并粘贴到错误和概念
上一篇 2025年12月13日 11:44:42
使用 PyTorch、NumPy、NLTK 和 Nextjs 构建全栈聊天机器人 – 4 小时完整教程
下一篇 2025年12月13日 11:44:54

相关推荐

  • python中zip函数详解 python多序列压缩zip函数应用场景

    zip函数的应用场景包括:1) 同时遍历多个序列,2) 合并多个列表的数据,3) 数据分析和科学计算中的元素运算,4) 处理csv文件,5) 性能优化。zip函数是一个强大的工具,能够简化代码并提高处理多个序列时的效率。 在Python中,zip函数是一个非常有用的工具,它能够将多个可迭代对象打包成…

    2026年5月10日
    000
  • JS如何实现迭代器?迭代器协议

    JavaScript中实现迭代器需遵循可迭代协议和迭代器协议,通过定义[Symbol.iterator]方法返回具备next()方法的迭代器对象,从而支持for…of和展开运算符;该机制统一了数据结构的遍历接口,实现惰性求值,适用于自定义对象、树、图及无限序列等复杂场景,提升代码通用性与…

    2026年5月10日
    000
  • 虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版虫虫漫画直接进入官网入口_虫虫漫画网页版清爽版

    虫虫漫画官网入口为www.ccmh.com,用户可直接通过浏览器访问,支持多端适配与账号同步功能,界面简洁无广告,提供海量国漫、日漫、韩漫资源,涵盖恋爱、玄幻等热门题材,更新及时,支持多种阅读模式及离线缓存,阅读体验流畅。 虫虫漫画直接进入官网入口在哪里?这是不少网友都关注的,接下来由PHP小编为大…

    2026年5月10日 用户投稿
    100
  • HTML/CSS中链接与按钮的正确嵌套:避免文本超链接化与结构优化指南

    本教程旨在解决HTML中链接()与按钮(button)或类按钮元素嵌套不当导致非预期文本超链接化的问题。我们将通过修正标签的错误闭合,并推荐使用 等语义化元素作为链接内容并应用按钮样式,来创建功能正确、结构清晰且包含文本或图像的交互式按钮,从而提升页面的可维护性和用户体验。 在网页开发中,我们经常需…

    2026年5月10日
    000
  • 如何根据当前月份动态排序 1-12 月?

    根据当前月份动态排序 1-12 月 想要实现根据当前月份动态排序 1-12 月,可以通过参考以下方法: 创建月份数组:首先,创建一个包含 1-12 月信息(如名称和值)的月份数组。获取当前月份:获取 javascript 中表示当前月份的数值(从 0 到 11)。重新排序月份数组:使用 javasc…

    2026年5月10日
    000
  • 解决PHP foreach循环中变量“继承”问题:理解与避免意外数据泄露

    本文探讨PHP foreach循环中一个常见的陷阱:当循环内部的数组或变量未被显式初始化时,其值可能会“继承”自上一次循环迭代,导致意外的数据泄露和逻辑错误。文章将深入分析这一现象的根源,并通过示例代码展示如何通过在每次迭代开始时正确初始化变量来解决此问题,确保代码行为的预期一致性。 引言:fore…

    2026年5月10日
    100
  • Angular mat-tab 高度自适应与布局优化指南

    本教程旨在解决Angular Material mat-tab组件在Flexbox布局中无法自动填充父容器高度的问题。文章将深入分析问题根源,并提供使用CSS深度选择器(::ng-deep)精确控制mat-tab-body-wrapper和mat-tab-body高度的解决方案,确保组件在指定布局下…

    2026年5月10日
    000
  • html如何制作水印_HTML水印(文字/图片)添加与设置方法

    使用CSS和HTML可实现网页水印,方法包括:一、通过background-image与data URI嵌入斜向文字水印;二、利用伪元素结合transform旋转生成叠加文字层;三、插入img标签或背景图设置固定位置图片水印;四、用Canvas绘制多行斜纹并转Base64作背景;五、通过禁用右键、屏…

    2026年5月10日
    100
  • 使用CSS Grid实现不规则列布局:告别传统表格的限制

    本教程详细阐述如何利用css grid实现复杂的、不规则的列布局,尤其适用于那些传统html表格难以实现的块状结构。文章将通过具体的css属性和html结构示例,指导读者如何定义网格、控制子项的跨度与位置,以及优化自动布局流程,从而高效构建灵活且响应式的页面布局。 1. 传统表格的局限与CSS Gr…

    2026年5月10日
    000
  • WordPress自定义主题中根据文章数量动态显示/隐藏“查看更多”按钮的教程

    本教程旨在指导开发者如何在wordpress自定义主题中,根据特定文章类型和分类的实际数量,动态控制“查看更多”按钮的显示与隐藏。我们将利用 wp_query 及其 found_posts 属性,精确判断符合条件的文章总数,从而在有更多文章时显示按钮,在无文章时显示提示信息,优化用户体验。 引言 在…

    2026年5月10日
    000
  • CSS Flexbox:在居中对齐时优雅地控制元素间距

    本文深入探讨了在css flexbox布局中,当容器使用`display: flex`和`justify-content: center`进行居中对齐时,如何有效地在子元素之间添加间距。我们将分析传统方法(如子元素的`margin`和容器的`padding`)的局限性,并重点介绍现代且推荐的`gap…

    2026年5月10日
    000
  • C#如何处理异常?C# try-catch-finally最佳实践与常见错误规避

    正确使用 try-catch-finally 应捕获具体异常、用 finally 或 using 释放资源、避免空 catch 和裸抛异常,确保异常日志记录并保留堆栈跟踪,提升代码健壮性与可维护性。 在C#中,异常处理是保障程序稳定运行的重要机制。正确使用 try-catch-finally 结构不…

    2026年5月10日
    000
  • CSS的display属性有哪些值?inline和block有什么区别?

    CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?CSS的display属性有哪些值?inline和block有什么区别?

    css的display属性通过定义元素的显示方式来控制网页布局。1.block元素独占一行,可设置宽高,默认如div、p等;2.inline元素不独占行,宽高由内容决定,如span、a;3.inline-block兼具block和inline特性,可并排显示且能设尺寸;4.none隐藏元素且不占空间…

    2026年5月10日 用户投稿
    000
  • 优化 Laravel Eloquent 查询:高效构建用户排行榜数据

    本教程详细讲解如何优化 Laravel Eloquent 查询以高效生成基于关联记录计数的排行榜。通过识别并消除冗余的 whereHas 子句,并巧妙利用 withCount 的条件闭包,我们能显著提升查询性能,大幅缩短数据获取时间,从而改善用户体验并降低数据库负载。 在 laravel 应用开发中…

    2026年5月10日
    000
  • python如何将列表转换为字符串_python列表与字符串相互转换技巧

    将列表转换为字符串需用join()方法,确保元素均为字符串类型;含非字符串元素时应先用列表推导式结合str()转换。 在Python中,将列表转换为字符串最常见且高效的方式是使用字符串的 join() 方法;而将字符串转换为列表,则主要依赖于字符串的 split() 方法,或者针对特定需求使用 li…

    2026年5月10日
    200
  • CSS多级下拉菜单布局优化:解决li元素高度自适应与多列排版问题

    本文深入探讨了css多级下拉菜单中li元素高度自适应与多列排版布局的优化策略。针对传统flex布局可能遇到的高度填充问题,文章介绍了如何利用column-count属性在父容器中创建多列布局,并结合float: left使子li元素在列中自然排列,实现动态高度适应,从而构建出结构清晰、内容丰富的响应…

    2026年5月10日
    000
  • HTML代码怎么实现响应式布局_HTML代码响应式布局原理与媒体查询应用

    响应式布局的核心原理是“一次开发,多端适应”,其本质在于通过弹性网格、流式图片和CSS媒体查询等技术,使网页能根据设备屏幕尺寸、分辨率等特性动态调整布局与内容呈现。与传统固定宽度布局不同,响应式设计采用相对单位(如%、rem、vw)、灵活的图片处理及媒体查询,实现移动端优先、自适应多设备的连续体验。…

    2026年5月10日
    000
  • php聚合式迭代器是什么

    聚合式迭代器通过组合多个迭代器实现统一遍历,PHP中常用AppendIterator(顺序聚合)和MultipleIterator(并行聚合)实现;适用于合并数据集、构建复合输出等场景。 PHP中的聚合式迭代器(Aggregate Iterator)并不是一个官方定义的独立类或接口,而是指通过组合多…

    2026年5月10日
    000
  • HTML如何制作网格布局?grid和flexbox的区别?

    要制作真正的网格布局应首选css grid,因为它是专为二维布局设计的工具,能同时控制行和列;而flexbox适用于一维线性布局,适合沿单一轴线排列内容。1. 使用css grid时,先设置容器的display: grid,再通过grid-template-columns和grid-template…

    用户投稿 2026年5月10日
    000
  • HTML如何实现生日倒计时?剩余天数怎么计算?

    是的,通过动态调整目标生日年份可确保跨年倒计时准确,1.首先获取当前年份的生日日期,2.若该日期已过,则将目标设为下一年生日,3.通过时间戳差值计算剩余天、小时、分钟、秒,4.每秒更新显示并补零格式化,5.归零时显示“生日快乐”动画提示,从而实现全年准确的倒计时效果。 HTML实现生日倒计时,主要是…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信