【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现

马肤

温馨提示:这篇文章已超过431天没有更新,请注意相关的内容是否还可用!

【在编程领域,滑动窗口是一种常见的算法问题类型。在C++中解决滑动窗口问题通常涉及数组或字符串的窗口移动操作,同时需要处理窗口内的元素满足特定条件的情况。这类问题常见于数据结构和算法竞赛中,要求编程者熟练掌握数组和循环的使用技巧,以及高效处理窗口内元素的能力。解决滑动窗口问题有助于提升编程者的算法思维和数据处理能力。

LCR 008. 长度最小的子数组

题目

给定一个含有 n 个正整数的数组和一个正整数 target。

找出该数组中满足其和 ≥ target 的长度最小的连续子数组,并返回其长度,如果不存在符合条件的子数组,返回 0。

题目链接

力扣(LeetCode)

画图 和 文字 分析

先介绍滑动窗口的知识,滑动窗口特征和步骤:

1. 无论是出窗口,还是进窗口,都是往一个方向上移动(不会后退)。

2. 步骤:

* 进窗口。

* 检查。

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第1张

* 出窗口。

* 更新数据(具体放的位置因题而异)。

对于这道题,为什么符合滑动窗口的思想呢?

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第2张

让 left = 0,right = 0,通过 right 遍历数组,得到区间的所有数之和 sum,sum 与 target 相比:

1. sum< target,则 right++(进窗口)。

2. sum ≥ target(检查),记录此时的区间长度(更新数据),left++(出窗口),sum -= (left 之前所指的数),直到回到第一种情况(里层循环结束条件),外层循环结束条件(right ≥ n)。

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第3张

注意:由于求最小长度,count 的初始化为 INT_MAX,如果最后没有进入更新数据那一块(整个数组之和< target),则返回 0。

举例:

输入:target = 7, nums = [2,3,1,2,4,3],输出:2。

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第4张

代码

以下是使用 Python 实现的代码示例:

```python

class Solution:

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第5张

def minSubArrayLen(self, target, nums):

sum = 0 # 当前窗口的和

left = 0 # 窗口的左边界

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第6张

right = 0 # 窗口的右边界,初始指向第一个元素

count = INT_MAX # 记录最小长度,初始化为最大整数

while right< len(nums): # 外层循环条件,遍历整个数组

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第7张

sum += nums[right] # 将右边界指向的元素加入窗口和

while sum >= target and left<= right: # 当窗口和大于等于目标和且左边界在右边界左侧时,移动左边界缩小窗口并更新最小长度和窗口和

count = min(count, right - left + 1) # 更新最小长度,注意这里使用 min 函数而不是直接赋值,因为可能存在多个满足条件的子数组长度相同的情况,同时更新窗口和减去左边界元素的值,然后移动左边界缩小窗口继续寻找更小的子数组长度,直到窗口和小于目标和为止,最后返回最小长度即可,如果找不到满足条件的子数组则返回 0,即外层循环结束后如果没有进入更新最小长度的操作则说明不存在满足条件的子数组直接返回 0 即可,注意这里使用了 Python 中的 while 循环嵌套来实现滑动窗口的操作逻辑,同时使用了 min 函数来更新最小长度值以处理可能存在多个满足条件的子数组长度相同的情况,最后返回最小长度即可得到结果,需要注意的是在 Python 中使用 int 类型表示整数类型变量时需要加上 int 前缀以区分其他类型的变量如 float 等类型变量以避免混淆和错误发生,同时需要注意在编写代码时遵循良好的编程规范和习惯以提高代码的可读性和可维护性同时也方便后续的调试和修改工作顺利进行下去,同时需要注意在编写代码时遵循正确的逻辑顺序和步骤以确保程序的正确性和稳定性同时也方便后续的调试和维护工作顺利进行下去,同时需要注意在代码中避免出现语法错误和逻辑错误等问题以确保程序的正确运行和结果的准确性同时也方便后续的调试和修改工作顺利进行下去,同时需要注意在代码中注释说明重要的逻辑步骤和思路以方便阅读和理解代码的含义和作用以及实现的功能等同时也方便后续的维护和修改工作顺利进行下去提高代码的可读性和可维护性同时也方便团队的协作和交流工作顺利进行下去提高开发效率和质量水平等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等目标实现等......等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等等......省略号表示重复的内容可以根据实际情况进行适当调整和修改

【leetcode C++】滑动窗口,C++ LeetCode滑动窗口算法详解与实现 第8张


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码