在我們系列的第二部分中,我們深入研究解決編碼面試問題的最通用的模式之一:滑動視窗。此技術對於優化涉及連續元素的子數組或子字串的問題非常有用,例如最大化總和、查找序列中的特定條件或處理字串中的子字串。
在我們開始之前,如果您正在尋找準備程式設計面試的全面指南,請考慮查看《破解編碼面試》,這是任何認真想在頂級科技公司找到工作的人的必備書籍。
滑動視窗模式是一種技術,可讓您有效地解決需要考慮較大資料集中的資料子集(例如數組的子數組或字串的子字串)的問題。這種技術不是每次移動視窗時都重新計算子集,而是維護一個運行總計或條件,在資料之間滑動以最大程度地減少不必要的工作。
範例問題:給定一個整數陣列和一個數字 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 的最大和子數組
指定された合計を持つ最小の部分配列
ウィンドウの境界の観点から考える: ウィンドウの開始位置と終了位置を考えることから始めます。これは、作業している正確な範囲を識別するのに役立ちます。
動的ウィンドウにはハッシュマップまたはセットを使用します: 部分文字列または一意の要素を扱う場合は、セットを使用してウィンドウ内の要素を追跡します。
総当たりで開始してから最適化する: 問題によっては、総当たりのアプローチ (考えられるすべてのサブ配列をチェックするなど) から始めると、スライディング ウィンドウがどのように不必要なデータを削減するかを視覚化するのに役立ちます。仕事。
最適な条件を探す: 問題に最適化コンポーネント (合計や長さの最小化または最大化など) がある場合は、スライディング ウィンドウが適している可能性があります。
スライディング ウィンドウ パターンは、多くのコーディング インタビューの問題、特に配列や文字列などのシーケンスに関係する問題を解決するための強力なツールです。固定サイズのスライディング ウィンドウと動的スライディング ウィンドウの両方を習得することで、より効率的にさまざまな問題に取り組むことができます。
次の記事では、ツー ポインター手法について説明します。これは、要素間のペアや比較を伴う問題でスライディング ウィンドウ アプローチを補完することが多い、もう 1 つの非常に効果的な戦略です。
パート 3 をお楽しみに!
以上是破解編碼面試:滑動視窗模式的一部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!