」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 破解編碼面試:部分滑動窗口模式

破解編碼面試:部分滑動窗口模式

發佈於2025-03-04
瀏覽:724

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]刪除
最新教學 更多>
  • Java為何無法創建泛型數組?
    Java為何無法創建泛型數組?
    通用陣列創建錯誤 arrayList [2]; JAVA報告了“通用數組創建”錯誤。為什麼不允許這樣做? 答案:Create an Auxiliary Class:public static ArrayList<myObject>[] a = new ArrayList<my...
    程式設計 發佈於2025-07-18
  • 如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    如何從PHP中的Unicode字符串中有效地產生對URL友好的sl。
    為有效的slug生成首先,該函數用指定的分隔符替換所有非字母或數字字符。此步驟可確保slug遵守URL慣例。隨後,它採用ICONV函數將文本簡化為us-ascii兼容格式,從而允許更廣泛的字符集合兼容性。 接下來,該函數使用正則表達式刪除了不需要的字符,例如特殊字符和空格。此步驟可確保slug僅包...
    程式設計 發佈於2025-07-18
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-07-18
  • 圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    圖片在Chrome中為何仍有邊框? `border: none;`無效解決方案
    在chrome 中刪除一個頻繁的問題時,在與Chrome and IE9中的圖像一起工作時,遇到了一個頻繁的問題。和“邊境:無;”在CSS中。要解決此問題,請考慮以下方法: Chrome具有忽略“ border:none; none;”的已知錯誤,風格。要解決此問題,請使用以下CSS ID塊創建帶...
    程式設計 發佈於2025-07-18
  • 在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8 MySQL表中正確將Latin1字符轉換為UTF8的方法
    在UTF8表中將latin1字符轉換為utf8 ,您遇到了一個問題,其中含義的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致電。為了解決此問題,您正在嘗試使用“ mb_convert_encoding”和“ iconv”轉換受...
    程式設計 發佈於2025-07-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-07-18
  • 查找當前執行JavaScript的腳本元素方法
    查找當前執行JavaScript的腳本元素方法
    如何引用當前執行腳本的腳本元素在某些方案中理解問題在某些方案中,開發人員可能需要將其他腳本動態加載其他腳本。但是,如果Head Element尚未完全渲染,則使用document.getElementsbytagname('head')[0] .appendChild(v)的常規方...
    程式設計 發佈於2025-07-18
  • 哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    哪種方法更有效地用於點 - 填點檢測:射線跟踪或matplotlib \的路徑contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    程式設計 發佈於2025-07-18
  • 如何在無序集合中為元組實現通用哈希功能?
    如何在無序集合中為元組實現通用哈希功能?
    在未訂購的集合中的元素要糾正此問題,一種方法是手動為特定元組類型定義哈希函數,例如: template template template 。 struct std :: hash { size_t operator()(std :: tuple const&tuple)const {...
    程式設計 發佈於2025-07-18
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-07-18
  • 如何高效地在一個事務中插入數據到多個MySQL表?
    如何高效地在一個事務中插入數據到多個MySQL表?
    mySQL插入到多個表中,該數據可能會產生意外的結果。雖然似乎有多個查詢可以解決問題,但將從用戶表的自動信息ID與配置文件表的手動用戶ID相關聯提出了挑戰。 使用Transactions和last_insert_id() 插入用戶(用戶名,密碼)值('test','tes...
    程式設計 發佈於2025-07-18
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-07-18
  • 在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在程序退出之前,我需要在C ++中明確刪除堆的堆分配嗎?
    在C中的顯式刪除 在C中的動態內存分配時,開發人員通常會想知道是否有必要在heap-procal extrable exit exit上進行手動調用“ delete”操作員,但開發人員通常會想知道是否需要手動調用“ delete”操作員。本文深入研究了這個主題。 在C主函數中,使用了動態分配變量(...
    程式設計 發佈於2025-07-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-07-18
  • CSS強類型語言解析
    CSS強類型語言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    程式設計 發佈於2025-07-18

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3