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

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

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

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]刪除
最新教學 更多>
  • JavaScript計算兩個日期之間天數的方法
    JavaScript計算兩個日期之間天數的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    程式設計 發佈於2025-05-14
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-14
  • 如何使用Python理解有效地創建字典?
    如何使用Python理解有效地創建字典?
    在python中,詞典綜合提供了一種生成新詞典的簡潔方法。儘管它們與列表綜合相似,但存在一些顯著差異。 與問題所暗示的不同,您無法為鑰匙創建字典理解。您必須明確指定鍵和值。 For example:d = {n: n**2 for n in range(5)}This creates a dict...
    程式設計 發佈於2025-05-14
  • MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    MySQL中如何高效地根據兩個條件INSERT或UPDATE行?
    在兩個條件下插入或更新或更新 solution:的答案在於mysql的插入中...在重複鍵更新語法上。如果不存在匹配行或更新現有行,則此功能強大的功能可以通過插入新行來進行有效的數據操作。如果違反了唯一的密鑰約束。 實現所需的行為,該表必須具有唯一的鍵定義(在這種情況下為'名稱'...
    程式設計 發佈於2025-05-14
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-05-14
  • 反射動態實現Go接口用於RPC方法探索
    反射動態實現Go接口用於RPC方法探索
    在GO 使用反射來實現定義RPC式方法的界面。例如,考慮一個接口,例如:鍵入myService接口{ 登錄(用戶名,密碼字符串)(sessionId int,錯誤錯誤) helloworld(sessionid int)(hi String,錯誤錯誤) } 替代方案而不是依靠反射...
    程式設計 發佈於2025-05-14
  • 可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    可以在純CS中將多個粘性元素彼此堆疊在一起嗎?
    [2这里: https://webthemez.com/demo/sticky-multi-header-scroll/index.html posite:sticky; sticky; .Sticky-1 {[ top:1em; z-index:1; 1; { display:gr...
    程式設計 發佈於2025-05-14
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-05-14
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-05-14
  • 如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    如何為PostgreSQL中的每個唯一標識符有效地檢索最後一行?
    postgresql:為每個唯一標識符在postgresql中提取最後一行,您可能需要遇到與數據集合中每個不同標識的信息相關的信息。考慮以下數據:[ 1 2014-02-01 kjkj 在數據集中的每個唯一ID中檢索最後一行的信息,您可以在操作員上使用Postgres的有效效率: id dat...
    程式設計 發佈於2025-05-14
  • 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-05-14
  • Go web應用何時關閉數據庫連接?
    Go web應用何時關閉數據庫連接?
    在GO Web Applications中管理數據庫連接很少,考慮以下簡化的web應用程序代碼:出現的問題:何時應在DB連接上調用Close()方法? ,該特定方案將自動關閉程序時,該程序將在EXITS EXITS EXITS出現時自動關閉。但是,其他考慮因素可能保證手動處理。 選項1:隱式關閉終...
    程式設計 發佈於2025-05-14
  • 人臉檢測失敗原因及解決方案:Error -215
    人臉檢測失敗原因及解決方案:Error -215
    錯誤處理:解決“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“檢測”中的錯誤:在功能檢測中。”當Face Cascade分類器(即面部檢測至關重要的組件)未正確加載時,通常會出現此錯誤。 要解決此問題,必...
    程式設計 發佈於2025-05-14
  • 在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    在Ubuntu/linux上安裝mysql-python時,如何修復\“ mysql_config \”錯誤?
    mysql-python安裝錯誤:“ mysql_config找不到”“ 由於缺少MySQL開發庫而出現此錯誤。解決此問題,建議在Ubuntu上使用該分發的存儲庫。使用以下命令安裝Python-MysqldB: sudo apt-get安裝python-mysqldb sudo pip in...
    程式設計 發佈於2025-05-14

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

Copyright© 2022 湘ICP备2022001581号-3