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

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

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

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]删除
最新教程 更多>
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-04-18
  • 如何在GO编译器中自定义编译优化?
    如何在GO编译器中自定义编译优化?
    在GO编译器中自定义编译优化 GO中的默认编译过程遵循特定的优化策略。 However, users may need to adjust these optimizations for specific requirements.Optimization Control in Go Compi...
    编程 发布于2025-04-18
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-04-18
  • WinRT HttpClient设置授权头方法指南
    WinRT HttpClient设置授权头方法指南
    [2 将授权标题添加到WinRT的HTTPCLIENT winrt的缺少.net class 挑战:如何将授权标题(例如OAuth)添加到winrt httpclient httpclient.defaultrequestheaders.authorization = 新的A...
    编程 发布于2025-04-18
  • 如何在Java字符串中有效替换多个子字符串?
    如何在Java字符串中有效替换多个子字符串?
    在java 中有效地替换多个substring,需要在需要替换一个字符串中的多个substring的情况下,很容易求助于重复应用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    编程 发布于2025-04-18
  • 如何在无序集合中为元组实现通用哈希功能?
    如何在无序集合中为元组实现通用哈希功能?
    在未订购的集合中的元素要纠正此问题,一种方法是手动为特定元组类型定义哈希函数,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    编程 发布于2025-04-18
  • Java字符串非空且非null的有效检查方法
    Java字符串非空且非null的有效检查方法
    检查字符串是否不是null而不是空的 if(str!= null && str.isementy())二手: if(str!= null && str.length()== 0) option 3:trim()。isement(Isement() trim whitespace whitesp...
    编程 发布于2025-04-18
  • `console.log`显示修改后对象值异常的原因
    `console.log`显示修改后对象值异常的原因
    foo = [{id:1},{id:2},{id:3},{id:4},{id:id:5},],]; console.log('foo1',foo,foo.length); foo.splice(2,1); console.log('foo2', foo, foo....
    编程 发布于2025-04-18
  • 如何将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-04-18
  • 如何高效地在一个事务中插入数据到多个MySQL表?
    如何高效地在一个事务中插入数据到多个MySQL表?
    mySQL插入到多个表中,该数据可能会产生意外的结果。虽然似乎有多个查询可以解决问题,但将从用户表的自动信息ID与配置文件表的手动用户ID相关联提出了挑战。使用Transactions和last_insert_id() 插入用户(用户名,密码)值('test','test...
    编程 发布于2025-04-18
  • 如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    如何使用Java.net.urlConnection和Multipart/form-data编码使用其他参数上传文件?
    使用http request 上传文件上传到http server,同时也提交其他参数,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    编程 发布于2025-04-18
  • 解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    解决MySQL错误1153:数据包超出'max_allowed_packet'限制
    mysql错误1153:故障排除比“ max_allowed_pa​​cket” bytes 更大的数据包,用于面对阴谋mysql错误1153,同时导入数据capase doft a Database dust?让我们深入研究罪魁祸首并探索解决方案以纠正此问题。理解错误此错误表明在导入过程中接...
    编程 发布于2025-04-18
  • 如何将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-04-18
  • 如何使用组在MySQL中旋转数据?
    如何使用组在MySQL中旋转数据?
    在关系数据库中使用mySQL组使用mySQL组进行查询结果,在关系数据库中使用MySQL组,转移数据的数据是指重新排列的行和列的重排以增强数据可视化。在这里,我们面对一个共同的挑战:使用组的组将数据从基于行的基于列的转换为基于列。让我们考虑以下查询: select data d.data_ti...
    编程 发布于2025-04-18
  • 使用jQuery如何有效修改":after"伪元素的CSS属性?
    使用jQuery如何有效修改":after"伪元素的CSS属性?
    在jquery中了解伪元素的限制:访问“ selector 尝试修改“:”选择器的CSS属性时,您可能会遇到困难。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    编程 发布于2025-04-18

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

Copyright© 2022 湘ICP备2022001581号-3