シリーズのこの第2部では、コーディングインタビューの質問を解決するための最も用途の広いパターンの1つであるスライドウィンドウに飛び込みます。この手法は、合計の最大化、シーケンス内の特定の条件を見つける、文字列内のサブストリングの操作など、隣接する要素のサブアレイまたはサブストリングを含む問題を最適化するのに非常に役立ちます。
。始める前に、コーディングインタビューの準備のための包括的なガイドを探している場合は、コーディングインタビューのクラッキングをチェックすることを検討してください。
スライドウィンドウパターンの概要。
スライドウィンドウを使用する時期:
def max_sum_subarray(arr、k):
#変数を初期化して、最大合計と現在のウィンドウ合計を保存します。
max_sum = 0
window_sum = 0
#最初に、初期ウィンドウの合計(最初の 'k'要素)を計算します。
範囲(k)のIのために:
window_sum = arr [i]
#max_sumを最初のウィンドウの合計に設定します。
max_sum = window_sum
#次に、アレイ全体にウィンドウをスライドさせます。
#kth要素から起動し、配列の最後まで移動します。
範囲のi(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を返します
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:
サイズkのウィンドウが初期化されます。
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 in Range(len(arr))の場合:
#現在の要素をwindow_sumに追加します。
window_sum = arr [window_end]
#現在のウィンドウの合計はs以上ですが、
while whind_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!= float( 'inf')else 0を返します
説明
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
合計がs。 条件が満たされると、ウィンドウは左(window_start)から収縮し始めて、最小サブアレイサイズを見つけます。。
このアプローチは、再構成を回避することにより、O(n^2)からO(n)に問題を減らすため、効率的です。初期条件:固定ウィンドウの場合、最初のウィンドウの合計/製品/条件を初期化します。動的なウィンドウの場合、初期条件は問題の目標に依存します。
ウィンドウをスライドします:
動的ウィンドウの場合:満足しようとしている状態に基づいてウィンドウを展開または縮小します。
スライドウィンドウを使用した一般的なインタビューの質問
:文字列sが与えられた場合、文字を繰り返すことなく最長のサブストリングの長さを見つけます。
パターン:整数と整数kの配列が与えられた場合、サイズkのサブアレイの最大合計を見つけます。。
パターンパターン
:拡張する動的なスライディングウィンドウを使用して、有効なサブアレイと契約を見つけてその長さを最小限に抑えます。:サブストリングまたはユニークな要素を扱うときは、セットを使用してウィンドウ内の要素を追跡します。
を最適化します:いくつかの問題では、ブルートフォースアプローチ(すべての可能なサブアレイをチェックするなど)から始めて、スライドウィンドウが不要な作業を減らす方法を視覚化するのに役立ちます。
最適な条件を探します結論
次の記事では、 2つのポインター手法
を調べます。免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3