ホームページ >ウェブフロントエンド >jsチュートリアル >コーディングインタビューの解読: スライディング ウィンドウ パターンの一部
シリーズの第 2 部では、コーディング面接の質問を解決するための最も汎用性の高いパターンの 1 つであるスライディング ウィンドウについて詳しく説明します。この手法は、合計の最大化、シーケンス内の特定の条件の検索、文字列内の部分文字列の操作など、連続する要素の部分配列または部分文字列に関連する問題を最適化する場合に非常に役立ちます。
始める前に、コーディング面接の準備のための包括的なガイドをお探しの場合は、一流テクノロジー企業への就職を真剣に考えている人にとって必携の本である『コーディング面接の突破』を参照することを検討してください。
スライディング ウィンドウ パターンは、より大きなデータセットからのデータのサブセット (配列の部分配列や文字列の部分文字列など) を考慮する必要がある問題を効率的に解決できる手法です。この手法では、ウィンドウを移動するたびにサブセットを再計算するのではなく、累計または条件を維持し、データ全体をスライドさせて不必要な作業を最小限に抑えます。
問題例: 整数の配列と数値 k を指定して、サイズ 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
説明:
問題例: 整数の配列と数値 S を指定して、合計が S 以上である最小の連続部分配列を見つけます。
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
説明:
ウィンドウの境界を定義します: ウィンドウの開始と終了を定義する必要があります。
初期条件を設定します: 固定ウィンドウの場合、最初のウィンドウの和/積/条件を初期化します。動的ウィンドウの場合、初期条件は問題の目標によって異なります。
ウィンドウをスライドさせます:
結果の確認と更新: ウィンドウを移動するたびに、必要に応じて結果 (最大合計、最小長など) を更新します。
繰り返し文字を含まない最長の部分文字列
サイズ K の最大合計部分配列
Kleinstes Subarray mit einer gegebenen Summe
Denken Sie in Bezug auf die Fenstergrenzen: Denken Sie zunächst darüber nach, wo das Fenster beginnen und enden soll. Dies hilft Ihnen, den genauen Bereich zu identifizieren, mit dem Sie arbeiten.
Verwenden Sie eine Hashmap oder ein Set für dynamische Fenster: Wenn Sie mit Teilzeichenfolgen oder eindeutigen Elementen arbeiten, verwenden Sie ein Set, um die Elemente im Fenster zu verfolgen.
Beginnen Sie mit Brute-Force und optimieren Sie dann: Bei manchen Problemen kann Ihnen der Beginn mit einem Brute-Force-Ansatz (z. B. die Überprüfung jedes möglichen Subarrays) dabei helfen, sich vorzustellen, wie ein Schiebefenster unnötige Ergebnisse reduzieren würde Arbeit.
Suchen Sie nach optimalen Bedingungen: Wenn das Problem eine Optimierungskomponente hat (wie das Minimieren oder Maximieren einer Summe oder Länge), kann ein Schiebefenster eine gute Lösung sein.
Das Sliding Window-Muster ist ein leistungsstarkes Werkzeug zur Lösung vieler Codierungsinterviewprobleme, insbesondere solcher, die Sequenzen wie Arrays oder Strings betreffen. Indem Sie sowohl Fenster mit fester Größe als auch dynamische Schiebefenster beherrschen, können Sie eine Vielzahl von Problemen effizienter lösen.
Im nächsten Artikel werden wir uns mit der Zwei-Zeiger-Technik befassen, einer weiteren äußerst effektiven Strategie, die häufig den Schiebefenster-Ansatz bei Problemen ergänzt, bei denen es um Paare oder Vergleiche zwischen Elementen geht.
Bleiben Sie gespannt auf Teil 3!
以上がコーディングインタビューの解読: スライディング ウィンドウ パターンの一部の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。