详解顺序结构滑动窗口处理算法

news2025/2/27 23:15:31

🎀个人主页: https://zhangxiaoshu.blog.csdn.net
📢欢迎大家:关注🔍+点赞👍+评论📝+收藏⭐️,如有错误敬请指正!
💕未来很长,值得我们全力奔赴更美好的生活!

前言

在数据结构和算法方面的面试中,数组和字符串的相关问题往往是一个重要的考察点。面试官通常会测试面试者在处理这些基础数据结构时的熟练程度,因为这直接关系到解决实际问题的能力。在数组和字符串的考察中,双指针和滑动窗口以及排序算法、字符串的处理API成为关键技巧,本文主要对滑动窗口进行简单介绍。


文章目录

  • 前言
  • 1. 序
  • 2. 滑动窗口原理
  • 3. 应用场景
    • (1)长度最小的子数组
    • (2)无重复字符的最长子串
    • (3)存在重复元素 II
  • 总结


1. 序

双指针和滑动窗口是在处理数组和字符串问题时常用的技巧。双指针通常用于解决数组中的一些查找或判断问题,通过设置两个指针在数组上移动,实现对数组的遍历和比较。滑动窗口则常用于解决字符串中的子串或子数组问题,通过维护一个可变大小的窗口在字符串上滑动,从而实现对子串或子数组的探测。

排序算法在面试中同样是一个重要的考察点,因为它与数组相关,对数据的整理和查找提供了基础。熟练掌握常见的排序算法,如快速排序、归并排序等,有助于在解决各种问题时更高效地处理数组。此外,对于字符串的处理API也是面试中需要掌握的知识。熟悉字符串的各种操作,如查找子串、替换字符、反转字符串等,能够帮助面试者更灵活地处理字符串相关的问题。

本文主要是对滑动窗口这种常用技巧进行简要介绍,帮助读者在面对数组和字符串相关问题时能够更加从容应对。深入理解这些技巧,并在实际问题中灵活运用,将有助于提高面试者在数据结构和算法面试中的表现。

2. 滑动窗口原理

滑动窗口法是一种在处理数组或字符串的子序列(子数组或子串)问题时常用的技巧。它通过维护一个动态的窗口来解决问题,窗口的起始和结束位置会根据问题的要求进行滑动。这种方法通常用于求解最长子串、最短子数组等问题。

在这里插入图片描述

基本思路:

  1. 初始化窗口的起始位置和结束位置。通常使用两个指针,比如 start 和 end,表示窗口的左右边界。

  2. 通过移动窗口的结束位置,扩大窗口。根据问题的要求,可以通过增加 end 指针的位置来扩展窗口。

  3. 通过移动窗口的起始位置,缩小窗口。当窗口包含的元素满足某个条件时,可以通过增加 start 指针的位置来缩小窗口。

  4. 重复以上步骤直到满足问题的条件。 在每一步中,都可以根据问题的要求更新窗口的状态,并在遍历完整个数组或字符串后得到问题的解。

滑动窗口法的优势在于它能够在线性时间内解决很多子序列问题,而无需使用额外的空间。这使得它在处理大规模数据时表现良好。

3. 应用场景

(1)长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3] 是该条件下的长度最小的子数组。

具体思路如下:

  • 初始化变量 ans 为整数的最大值 Integer.MAX_VALUE,start 和 end 分别表示当前子数组的起始和结束位置,sum 表示当前子数组的和。

  • 使用 while 循环遍历数组 nums,其中 end 指针负责扩大窗口,start 指针负责缩小窗口。

  • 在循环中,先将当前元素加到 sum 中,然后检查是否满足 sum >= target 的条件。如果满足,说明当前窗口的子数组和大于等于目标值,此时进入内部的 while 循环。

  • 在内部的 while 循环中,不断缩小窗口,即通过减去 nums[start] 的值来减小 sum。同时,更新 ans 为当前窗口的长度 end - start + 1 和 ans 之前值的较小值。这样,通过不断缩小窗口,可以找到满足条件的最小子数组。

  • 重复上述过程,直到 end 指针遍历完整个数组。

  • 返回最终结果 ans,如果 ans 仍然为 Integer.MAX_VALUE,说明没有找到满足条件的子数组,返回 0;否则,返回找到的最小子数组的长度。

class Solution {
    public int minSubArrayLen(int target, int[] nums) {

        int ans = Integer.MAX_VALUE;
        int start = 0, end = 0;
        int sum = 0;

        while(end < nums.length){
            sum += nums[end];
            while(sum >= target){
                sum-=nums[start];
                ans = Math.min(ans,end-start+1);
                start++;
            }
            end++;
        }
        return ans== Integer.MAX_VALUE ? 0 : ans;
    }
}

(2)无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

具体思路如下:

  • 初始化指针和数据结构: 使用 start 和 end 两个指针来表示当前子串的起始和结束位置,使用 HashSet 来存储当前子串中出现的字符。lenMax 用于记录最长不含重复字符的子串长度。

  • 滑动窗口: 通过不断移动 end 指针,扩大窗口。当遇到重复字符时,开始缩小窗口。

  • 处理重复字符:如果当前字符是新字符,将其添加到 set 中,然后更新 lenMax 为当前子串的长度(end - start + 1)的最大值。如果当前字符已经在 set 中,表示有重复字符,需要将 start 指针右移,并将对应的字符从 set 中移除,直到子串中不再包含重复字符。

  • 遍历完整个字符串: 通过不断移动 end 指针和更新 lenMax,直到 end 指针遍历完整个字符串。

  • 返回结果: 返回最终的 lenMax,即最长不含重复字符的子串的长度。

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int start=0;
        int end=0;

        HashSet<Character> set = new HashSet<Character>();

        int lenMax=0;

        while(end < s.length()){          
            if(set.add(s.charAt(end))){
                lenMax=Math.max(lenMax,end-start+1);
                end++;      
            }else{
               set.remove(s.charAt(start));
               start++;
           }
        }
        return lenMax;
    }
}

(3)存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
输入:nums = [1,2,3,1], k = 3
输出:true

  • 初始化数据结构: 使用一个 LinkedHashSet 来存储当前窗口中的元素,保持插入顺序。

  • 遍历数组: 使用两个指针 start 和 end 遍历数组,其中 end 指针负责扩大窗口,start 指针负责缩小窗口。

  • 判断重复元素: 在每一步中,首先检查当前窗口中是否包含数组中的元素 nums[end]。如果存在,表示存在重复元素,直接返回 true。

  • 保持窗口大小: 在窗口大小达到 k 之后,通过缩小窗口,即移除 set 中的元素 nums[start],并将 start 指针右移。

  • 遍历完整个数组: 重复上述步骤,直到 end 指针遍历完整个数组。

  • 返回结果: 如果在遍历过程中未找到重复元素,返回 false。

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int numLength = nums.length;
        Set<Integer> set = new LinkedHashSet<>();
        for(int start = 0, end = 0; end < numLength; end++){
            if(set.contains(nums[end])){
                return true;
            }
            set.add(nums[end]);
            while (end - start >= k){
                set.remove(nums[start]);
                start++;
            }
        }
        return false;
    }
}

总结

滑动窗口算法是一种用于解决数组或字符串中子序列(子数组或子串)问题的有效技巧。它通过维护一个动态的窗口,不断调整窗口的起始和结束位置,以满足问题的条件。以下是滑动窗口算法的关键特点、优势和应用场景:

  1. 关键特点:
  • 使用两个指针(通常是起始指针和结束指针)表示窗口的边界。
  • 通过不断移动窗口的边界,动态调整窗口的大小。
  • 用于解决需要求解子序列最优解的问题。
  1. 优势:
  • 高效: 滑动窗口算法通常具有线性时间复杂度,因为每个元素或字符只需被访问一次。
  • 空间效率: 使用常数级的额外空间,不需要存储整个子序列的信息,而是通过维护窗口的边界来解决问题。
  • 简洁: 算法思路相对简单,易于理解和实现。
  1. 应用场景:
  • 最长子串或子数组: 用于求解最长不含重复字符的子串、最短子数组等问题。
  • 满足条件的子串: 用于找到满足特定条件的子串,如包含指定字符、和大于等于某个值的子数组等。
  • 窗口内的统计信息: 用于在移动窗口的过程中动态计算窗口内元素的统计信息,如和、平均值等。
  • 固定长度的窗口: 用于处理固定长度的窗口,例如计算滑动窗口的平均值。
  1. 注意事项:
  • 确保窗口的起始和结束位置的移动是合理的,避免重复计算和漏算。
  • 处理窗口的边界条件,确保不越界。

总体来说,滑动窗口算法是一种高效、简洁的解决子序列问题的方法,在处理字符串和数组等数据结构时广泛应用。

文中有不对的地方欢迎指正、补充。

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

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

相关文章

亿道推出重磅加固平板!为行业发展注入新动力

随着科技生产力的不断发展&#xff0c;各行各业都得到质的飞跃。产品的迭代速度也大大加快&#xff0c;作为全球领先的加固行移动终端一站式提供商&#xff0c;亿道信息跟紧时代潮流&#xff0c;推出EM-I10J、EM-I20J两款均衡型加固平板&#xff0c;为行业发展注入新动力。 接地…

每日一题 2867统计树中的合法路径

2867. 统计树中的合法路径数目 题目描述&#xff1a; 给你一棵 n 个节点的无向树&#xff0c;节点编号为 1 到 n 。给你一个整数 n 和一个长度为 n - 1 的二维整数数组 edges &#xff0c;其中 edges[i] [ui, vi] 表示节点 ui 和 vi 在树中有一条边。 请你返回树中的 合法路…

【Linux深入剖析】进程优先级 | 命令行参数 | 环境变量

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 1.进程优先级2.Linux…

python Matplotlib Tkinter-->tab切换2

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.ttk as ttk# 创建自定义工具栏类 c…

护眼台灯如何选择?超全护眼台灯选购攻略分享

近年来护眼台灯的存在感非常强&#xff0c;已然成为家家户户必不可少的一盏灯具&#xff0c;如今市面上的台灯款式多得让人数不清&#xff0c;不过也正是如此&#xff0c;也导致了许多不专业不合格的产品混杂在其中&#xff0c;这类劣质台灯对光源的控制很差&#xff0c;使亮度…

【简写Mybatis】02-注册机的实现以及SqlSession处理

前言 注意&#xff1a; 学习源码一定一定不要太关注代码的编写&#xff0c;而是注意代码实现思想&#xff1a; 通过设问方式来体现代码中的思想&#xff1b;方法&#xff1a;5W1H 源代码&#xff1a;https://gitee.com/xbhog/mybatis-xbhog&#xff1b;https://github.com/xbh…

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…

Collectors.toMap的value为空报NullPointerException

1、现象 import lombok.Data; import org.apache.commons.lang3.StringUtils;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collect…

Ps:索引颜色模式

Ps菜单&#xff1a;图像/模式/索引颜色 Image/Mode/Indexed Color 索引颜色 Indexed Color模式可生成最多 256 种颜色的 8 位图像文件。 这种颜色的限制使得索引颜色模式的图像文件相比于全彩图像&#xff08;如 RGB 颜色模式下的图像&#xff09;具有更小的文件大小&#xff0…

学习磁盘管理

文章目录 一、磁盘接口类型二、磁盘设备的命名三、fdisk分区四、自动挂载五、扩容swap六、GPT分区七、逻辑卷管理八、磁盘配额九、RAID十、软硬链接 一、磁盘接口类型 IDE、SATA、SCSI、SAS、FC&#xff08;光纤通道&#xff09; IDE, 该接口是并口。SATA, 该接口是串口。SCS…

Neoverse S3 系统 IP:机密计算和多芯片基础设施 SoC 的基础

第三代Neoverse系统IP Neoverse S3 产品推出了我们的第三代基础设施特定系统 IP&#xff0c;这是下一代基础设施 SOC 的理想基础&#xff0c;适用于从 HPC 和机器学习到 Edge 和 DPU 的各种应用。S3 机箱专注于为我们的合作伙伴提供 Chiplet、机密计算等关键创新以及 UCIe、DD…

使用R语言进行多元线性回归分析-多重共线的诊断

一、数据集 序号X1x2x3x4Y序号X1x2x3X4Y12666078.57831224472.51229155274.31954182293.12356850104.3111047426115.92143184787.6111140233483.8155263395.971266912113.311655922109.2111368812109.410771176102.73       1、从中选取主要变量&#xff0c;建立与因变…

NVM存储设备MTBF介绍

1. 概念 1.1. MTBF MTBF(Mean Time Between Failure)&#xff0c;平均故障间隔时间&#xff0c;也被称为平均无故障时间&#xff0c;是衡量一个产品的可靠性指标&#xff0c;其单位为小时。其定义为&#xff1a;产品在总的使用阶段累计工作时间与故障次数的比值&#xff1a; …

【软件测试】--功能测试2--常用设计测试用例方法

一、解决穷举场景 重点&#xff1a;使用等价类划分法 1.1 等价类划分法 重点&#xff1a;有效等价和单个无效等价各取1个即可。 步骤&#xff1a;1、明确需求2、确定有效和无效等价3、根据有效和无效造数据编写用例 1.2 案例&#xff08;qq合法验证&#xff09; 需求&#xff…

展厅设计在零售领域发挥哪些关键作用

1、 陈列和布局 零售展示设计的成功始于合适的陈列和布局。展厅设计公司考虑产品的类型、大小和特点&#xff0c;以创建有吸引力的展示。产品陈列应使顾客能够轻松浏览和访问。 2、色彩和照明 色彩和照明是零售展示设计的关键元素。展示区域的色彩和照明方案应与品牌形象一致&a…

GEE入门篇|遥感专业术语(实践操作4):光谱分辨率(Spectral Resolution)

目录 光谱分辨率&#xff08;Spectral Resolution&#xff09; 1.MODIS 2.EO-1 光谱分辨率&#xff08;Spectral Resolution&#xff09; 光谱分辨率是指传感器进行测量的光谱带的数量和宽度。 您可以将光谱带的宽度视为每个波段的波长间隔&#xff0c;在多个波段测量辐射亮…

雾锁王国Enshrouded多人联机专用服务器配置要求

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

GCC如何产生core dump

先决条件 1.安装apport&#xff08;automatically generate crash reports for debugging&#xff09; 2.修改/etc/security/limits.conf文件&#xff0c;使允许core dump&#xff0c;或者用ulimit -c unlimited设置core dump文件的大小为unlimited&#xff08;临时方案&#x…

【分享】WinRAR解压缩软件的3个密码功能

WinRAR是一款功能强大的解压缩软件&#xff0c;除了用来解压缩文件&#xff0c;还可以作为加密软件&#xff0c;给压缩包设置密码&#xff0c;达到保护文件的目的。今天来分享一下WinRAR的3个密码功能&#xff0c;一起来看看吧&#xff01; 功能一&#xff1a;设置“打开密码”…

TP6书写+uni前端,最新版本圈子系统,搭载各种插件,APP小程序H5公众都可以打包拥有,源码交付,支持二开!

部分插件展示 群聊插件 单独频道功能说明&#xff1a; 1、可申请建群。后台审核&#xff0c; 2、群分为自由加入和审核加入&#xff0c;由群主审核。 3、群聊天内容保存到数据库。 4、可查看附近的群&#xff0c;需要用户开启定位。 5、群主可踢人和禁言。 6、支持每个人提示音…