算法——滑动窗口

前言:本篇文章将继续分享一种新算法——滑动窗口。


长度最小的子数组

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

找出该数组中满足其总和大于等于 target 的长度最小的 连续

子数组

 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其长度如果不存在符合条件的子数组,返回 0 。

示例 1:

输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

示例 2:

输入:target = 4, nums = [1,4,4]
输出:1

示例 3:

输入:target = 11, nums = [1,1,1,1,1,1,1,1]
输出:0

意思就是全是正整数的数组中找到最小连续的几个数字,它们的和要 >= target。

比如示例一,2,3,1,2这个子数组的和同样满足条件,但是因为有更小的子数组4,3,所以结果为4,3。

那么我们该如何找到那个最小的子数组呢?

借助双指针的思想,定义两个指针均指向数组最左侧,然后左指针不动,让右指针不断向右移动,直到两个指针中间的所有数据的和>=target才停下,这样就能得到一个满足条件的子数组。

当满足条件之后,我们该怎么做呢??让右指针继续右移??当然不是,因为数组中的数据全是正整数,如果右指针继续右移,那么两指针之间的所有数字和仍然>=target,但是此时该子数组的长度变大了,不再满足最小子数组的条件

所以正确的做法是让left右移,开始寻找另一个子数组,而此时新子数组的数字和,只需要让原子数组的数字和减去left原本指向的数字即可。

如果此时我们把上述过程抽象成图形,就像一个窗口在数组上来回滑动:

所以滑动窗口即:两个同向移动的指针,而且均不会返回数组开头重新移动,同时还需要要操作的数据具有单调性,比如满足全是正整数。 

class Solution {
public:
    int minSubArrayLen(int target, vector<int>& nums) {
        int left = 0;
        int right = 0;
        int sum = 0;
        int length = INT_MAX;
        while(right < nums.size())
        {  
            sum += nums[right];
            while(sum >= target)
            {
                length = min(length,right - left + 1);
                sum -= nums[left++];
            }
            right++;
        }
        return length == INT_MAX ? 0 : length;
    }
};

每次找到更小的子数组均进行更新,而循环结束的条件无非就是right向右超出了数组的界限。 


总结

像这种需要再数组或者是一段连续的数据中求出满足要求的一端连续的子数组的问题,就可以通过滑动窗口的方法去快速解决。

关于滑动窗口就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!

  • 42
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 41
    评论
http://www.400gb.com/u/256394 译者序 前言 致谢 第1章 绪论  1.1 评估算法  1.2 修改算法   1.2.1 主要的优化:I/O   1.2.2 主要的优化:函数调用  1.3 资源和参考资料 第2章 基本数据结构  2.1 链表   2.1.1 双向链表   2.1.2 链表的其他特征  2.2 栈和队列   2.2.1 栈的特征   2.2.2 队列的特征 第3章 散列  3.1 散列的概念  3.2 散列函数  3.3 冲突解决方法   3.3.1 线性再散列法   3.3.2 非线性再散列法   3.3.3 外部拉链法  3.4 性能问题  3.5 资源和参考资料 第4章 查找  4.1 查找的特征   4.1.1 准备时间   4.1.2 运行时间     4.1.3 回溯的需要  4.2 蛮力查找  4.3 Boyer Moore查找   4.3.1 启发式方法#1:跳过字符   4.3.2 启发式方法#2:重复模式  4.4 多字符串查找  4.5 用于正则表达式的字符串查找:grep  4.6 近似字符串匹配技术  4.7 语音比较:Soundex算法  4.8 Metaphone:现代的Soundex  4.9 选择技术  4.10 资源和参考资料   4.10.1 通用参考资料   4.10.2 Boyer Moore   4.10.3 多字符串查找   4.10.4 正则表达式查找   4.10.5 近似字符串匹配   4.10.6 Soundex算法和Metaphone算法 第5章 排序  5.1 排序的基本特征   5.1.1 稳定性   5.1.2 对哨兵的需求   5.1.3 对链表进行排序的能力   5.1.4 输入的阶的相关性   5.1.5 对额外存储空间的需求   5.1.6 内部排序技术与外部排序技术  5.2 排序模型   5.2.1 冒泡排序   5.2.2 插入排序   5.2.3 希尔排序   5.2.4 快速排序   5.2.5 堆排序  5.3 对链表进行插入排序  5.4 对链表进行快速排序  5.5 对多个键进行排序——不稳定排序的修正方法  5.6 网络排序  5.7 小结:选择一种排序算法  5.8 资源和参考资料 第6章 树  6.1 二叉树   6.1.1 树查找   6.1.2 节点插入   6.1.3 节点删除   6.1.4 二叉查找树的性能   6.1.5 AVL树  6.2 红黑树  6.3 伸展树  6.4 B树   6.4.1 保持B树平衡   6.4.2 实现B树算法   6.4.3 B树实现的代码  6.5 可以看见森林吗  6.6 资源和参考资料 第7章 日期和时间  7.1 日期例程的库  7.2 时间例程  7.3 用于日期和时间数据的格式  7.4 最后的提醒  7.5 资源和参考资料 第8章 任意精度的算术  8.1 构建计算器8.2表示数字  8.3 计算  8.4 加法  8.5 减法  8.6 乘法  8.7 除法  8.8 关于计算器要注意的最后几点  8.9 用于计算平方根的牛顿算法  8.10 分期付款表  8.11 资源和参考资料 第9章 数据压缩  9.1 行程编码  9.2 霍夫曼压缩   9.2.1 代码   9.2.2 其他问题  9.3 滑动窗口压缩  9.4 基于字典的压缩(LZW)   9.4.1 LZW算法的伪代码   9.4.2 LZW压缩的实现   9.4.3 填满字典  9.5 使用哪种压缩方法  9.6 资源和参考资料 第10章 数据完整性和验证  10.1 简单的校验和  10.2 加权校验和  10.3 循环冗余校验   10.3.1 CRC CCITT   10.3.2 CRC 16   10.3.3 CRC 32   10.4 资源和参考资料
在处理图像滑动窗口算法时,可以使用Python来实现。首先,你需要将图像切片编号并存储为数字标识的文件名,比如1.png、2.png等。然后,你可以使用滑动窗口方法来获取所有卡顿的小区间的起始位置。 在Python中,你可以使用numpy库来进行滑动窗口的实现。下面是一个实例代码: ```python import numpy as np # 图像切片编号列表 image_slices = [1, 2, 3, 4, 5, 6, 7, 8, 9, ...] # 滑动窗口大小和步长 window_size = 3 step_size = 1 # 存储所有窗口的起始位置 window_positions = [] for i in range(len(image_slices) - window_size + 1): window_positions.append(image_slices[i: i + window_size]) print("所有窗口的起始位置:", window_positions) ``` 这段代码首先定义了图像切片编号列表`image_slices`,然后指定了滑动窗口的大小`window_size`和步长`step_size`。接着使用一个循环遍历整个图像切片编号列表,每次取出连续的窗口大小的切片,并将其存储到`window_positions`列表中。最后,输出所有窗口的起始位置。 请注意,这只是一个简单的示例,实际应用中你可能需要根据具体情况进行适当的调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【python】滑动窗口算法](https://blog.csdn.net/darlingmz/article/details/125815782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Python在大数据方面的应用前景](https://download.csdn.net/download/milk416666/88264587)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [数学模型——python实现滑动窗口算法(特征匹配)](https://blog.csdn.net/qq_55433334/article/details/127179881)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 41
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

很楠不爱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值