”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 破解编码面试:部分滑动窗口模式

破解编码面试:部分滑动窗口模式

发布于2025-03-04
浏览:201

Cracking the Coding Interview: Part  The Sliding Window Pattern在我们系列的第二部分中,我们进入了解决编码访谈问题的最广泛的模式之一:滑动窗口。该技术对于优化涉及连续元素的子阵列或子字的问题非常有用,例如最大化总和,在序列中找到特定条件或使用字符串中的子字符串。

在开始之前,如果您正在寻找准备编码面试的综合指南,请考虑检查编码访谈,这是一本必不可少的书,适合任何认真地在顶级科技公司找到工作的人。

滑动窗口模式的概述

滑动窗口模式是一种使您可以有效地解决需要从较大数据集中考虑数据子集的问题(例如数组的子阵列或字符串的子字符串)。该技术并没有在每次移动窗口时都要重新计算子集,而是要保持运行的总或条件,从而在数据上滑动以最大程度地减少不必要的工作。

何时使用滑动窗口:

问题涉及连续的子阵列或子字符串。

您需要在数据集的滑动范围内找到最大或最小总和,计数或其他条件。
它涉及固定的窗口大小或需要一个动态窗口,该窗口扩展或收缩。
  • 滑动窗口的类型
  • 1。
  • 修复了大小滑动窗口

是什么

:固定尺寸的窗口,该窗口在维护诸如SUM或产品之类的运行条件时滑过数组或字符串。

:查找大小k的子阵列的最大总和。
  • 示例问题:给定一个整数和一个数字k,找到大小为k的任何子阵列的最大总和。
  • def max_sum_subarray(arr,k): #初始化变量以存储最大总和和当前窗口总和。 max_sum = 0 window_sum = 0 #首先,计算初始窗口的总和(第一个“ k”元素)。 对于我的范围(k): window_sum = arr [i] #将max_sum设置为初始窗口的总和。 max_sum = window_sum #现在,将窗口滑过数组。 #从KTH元素开始,然后移动到数组的末尾。 对于我的范围(K,Len(arr)): #通过减去不再在窗口中的元素来滑动窗口 #(arr [i -k])并添加新元素(arr [i])。 window_sum = arr [i] -arr [i -k] #更新max_sum如果当前窗口总和大于以前的max_sum。 max_sum = max(max_sum,window_sum) #返回找到的最大总和。 返回max_sum
  • 解释

初始化了大小k的窗口。
窗口在整个数组中移动时,通过减去不再在窗口中的元素并添加进入窗口的新元素来实现滑动效果。

def max_sum_subarray(arr, k):
    # Initialize variables to store the maximum sum and the current window sum.
    max_sum = 0
    window_sum = 0

    # First, calculate the sum of the initial window (first 'k' elements).
    for i in range(k):
        window_sum  = arr[i]

    # Set the max_sum to the initial window's sum.
    max_sum = window_sum

    # Now, slide the window across the array. 
    # Start from the kth element and move until the end of the array.
    for i in range(k, len(arr)):
        # Slide the window by subtracting the element that is no longer in the window 
        # (arr[i - k]) and adding the new element (arr[i]).
        window_sum  = arr[i] - arr[i - k]

        # Update max_sum if the current window sum is greater than the previous max_sum.
        max_sum = max(max_sum, window_sum)

    # Return the maximum sum found.
    return max_sum

2。

动态滑动窗口
  • 是什么
  • :当窗口大小未固定时使用。窗口根据问题的要求扩展或合同(例如满足总和或条件)。
:找到大于或等于s的最小子阵列

:给定一个整数和一个数字s,找到最小的连续子阵列,其总和大于或等于s。 def smallest_subarray_with_sum(arr,s): #初始化变量: #window_sum:存储当前窗口的总和。 #min_length:存储找到最小子阵列的长度。 #window_start:滑动窗口的起始索引。 window_sum = 0 min_length = float('inf')#从大量开始,以比较最小长度。 window_start = 0 #在数组上迭代window_end是窗口的正确边界。 对于window_end(len(arr))中的window_end: #将当前元素添加到window_sum。 window_sum = arr [window_end] #虽然当前窗口的总和大于或等于s: whindow_sum> = s: #如果较小,则计算当前窗口大小并更新min_length。 min_length = min(min_length,window_end -window_start 1) #通过在window_start处删除元素,从左侧收缩窗口。 window_sum- = arr [window_start] #将窗口的开始向右移动。 window_start = 1 #如果更新了min_length,请返回;否则,返回0(意味着找不到有效的子阵列)。 返回min_length如果min_length!= float('inf')else 0

  • 解释
  • 窗口通过增加window_end扩展,直到总和超过或等于s。 一旦满足条件,窗口就会从左侧(window_start)开始收缩以找到最小的子阵列大小。 这种方法是有效的,因为它通过避免重新计算将问题从O(n^2)减少到O(n^2)。

实现滑动窗口解决方案的步骤
定义窗口边界

:您需要定义窗口的开始和结尾。
  def smallest_subarray_with_sum(arr, S):
    # Initialize variables:
    # window_sum: to store the sum of the current window.
    # min_length: to store the length of the smallest subarray found.
    # window_start: the starting index of the sliding window.
    window_sum = 0
    min_length = float('inf')  # Start with a large number to compare minimum lengths.
    window_start = 0

    # Iterate over the array with window_end being the right boundary of the window.
    for window_end in range(len(arr)):
        # Add the current element to the window_sum.
        window_sum  = arr[window_end]

        # While the current window's sum is greater than or equal to S:
        while window_sum >= S:
            # Calculate the current window size and update min_length if smaller.
            min_length = min(min_length, window_end - window_start   1)

            # Shrink the window from the left by removing the element at window_start.
            window_sum -= arr[window_start]

            # Move the start of the window to the right.
            window_start  = 1

    # If min_length was updated, return it; otherwise, return 0 (meaning no valid subarray was found).
    return min_length if min_length != float('inf') else 0

设置一个初始条件

:对于固定的Windows,初始化第一个窗口的sum/product/product/条件。对于动态窗口,初始条件取决于问题的目标。 滑动窗口

  • 用于固定窗口大小:通过添加下一个元素并删除窗口中不再的元素来移动窗口。
  • 用于动态窗口:根据您要满足的条件展开或收缩窗口。
检查结果
:在每个窗口移动之后,根据需要更新结果(例如最大总和,最小长度等)。

    使用滑动窗口的常见面试问题
  1. [2

  2. 问题
  3. :给定一个字符串,找到最长的子字符串的长度而无需重复字符。

    模式:使用动态滑动窗口展开直到找到重复的字符,然后收缩窗口直到满足条件为止。

  4. [2

      :使用固定的大小滑动窗口来维护k元素的总和,并在将窗口滑过数组时更新最大总和。
    • [2
  5. 模式

    :使用一个动态滑动窗口,该窗口扩展以找到有效的子阵列并合同以最小化其长度。

滑动窗口hacks进行面试

用窗口边界
    :开始思考窗口应在哪里开始和结束。这可以帮助您确定正在使用的确切范围。
  1. 使用hashmap或用于动态窗口的设置:在处理substrings或unique元素时,请使用集合来跟踪窗口中的元素。

    从蛮力开始,然后优化
      :在某些问题中,从蛮力方法开始(例如检查每个可能的子阵列)可以帮助您可视化滑动窗口如何减少不必要的工作。
    • 寻找最佳条件:如果问题具有优化组件(例如最小化或最大化总和或长度),则滑动窗口可能很合适。
    • 结论 滑动窗口模式是解决许多编码访谈问题的强大工具,尤其是涉及数组或字符串序列的编码面试问题。通过掌握固定尺寸和动态滑动窗口,您可以更有效地解决广泛的问题。
    在下一篇文章中,我们将探索
  2. ,这是另一种高效的策略,通常在涉及元素对成对或比较的问题中的滑动窗口方法中进行补充。
  3. 请关注第3部分!

版本声明 本文转载于:https://dev.to/zzeroyzz/cracking-the-coding-interview-part-2-the-sliding-window-pattern-520d?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-05-13
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-05-13
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否有必要在heap-procal extrable exit exit上进行手动调用“ delete”操作员,但开发人员通常会想知道是否需要手动调用“ delete”操作员。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(H...
    编程 发布于2025-05-13
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-05-13
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-13
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-05-13
  • 如何使用不同数量列的联合数据库表?
    如何使用不同数量列的联合数据库表?
    合并列数不同的表 当尝试合并列数不同的数据库表时,可能会遇到挑战。一种直接的方法是在列数较少的表中,为缺失的列追加空值。 例如,考虑两个表,表 A 和表 B,其中表 A 的列数多于表 B。为了合并这些表,同时处理表 B 中缺失的列,请按照以下步骤操作: 确定表 B 中缺失的列,并将它们添加到表的末...
    编程 发布于2025-05-13
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-05-13
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-05-13
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-05-13
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-13
  • PHP SimpleXML解析带命名空间冒号的XML方法
    PHP SimpleXML解析带命名空间冒号的XML方法
    在php 很少,请使用该限制很大,很少有很高。例如:这种技术可确保可以通过遍历XML树和使用儿童()方法()方法的XML树和切换名称空间来访问名称空间内的元素。
    编程 发布于2025-05-13
  • 如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    如何将PANDAS DataFrame列转换为DateTime格式并按日期过滤?
    Transform Pandas DataFrame Column to DateTime FormatScenario:Data within a Pandas DataFrame often exists in various formats, including strings.使用时间数据时...
    编程 发布于2025-05-13
  • 大批
    大批
    [2 数组是对象,因此它们在JS中也具有方法。 切片(开始):在新数组中提取部分数组,而无需突变原始数组。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    编程 发布于2025-05-13
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php PHP陷入困境。使用simplexmlelement :: attributes()函数提供了简单的解决方案。此函数可访问对XML元素作为关联数组的属性: - > attributes()为$ attributeName => $ attributeValue){ echo ...
    编程 发布于2025-05-13

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3