在我們系列的第二部分中,我們深入研究解決編碼面試問題的最通用的模式之一:滑動視窗。此技術對於優化涉及連續元素的子數組或子字串的問題非常有用,例如最大化總和、查找序列中的特定條件或處理字串中的子字串。
在我們開始之前,如果您正在尋找準備程式設計面試的全面指南,請考慮查看《破解編碼面試》,這是任何認真想在頂級科技公司找到工作的人的必備書籍。
滑動視窗模式是一種技術,可讓您有效地解決需要考慮較大資料集中的資料子集(例如數組的子數組或字串的子字串)的問題。這種技術不是每次移動視窗時都重新計算子集,而是維護一個運行總計或條件,在資料之間滑動以最大程度地減少不必要的工作。
範例問題:給定一個整數陣列和一個數字 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 的最大和子數組
Subarray Terkecil dengan Jumlah Diberi
Fikirkan dari segi sempadan tingkap: Mulakan dengan memikirkan di mana tetingkap harus bermula dan berakhir. Ini membantu anda mengenal pasti julat tepat yang anda gunakan.
Gunakan peta cincang atau set untuk tetingkap dinamik: Apabila berurusan dengan subrentetan atau elemen unik, gunakan set untuk menjejaki elemen dalam tetingkap.
Mulakan dengan brute-force dan kemudian mengoptimumkan: Dalam sesetengah masalah, bermula dengan pendekatan brute-force (seperti menyemak setiap subarray yang mungkin) boleh membantu anda membayangkan bagaimana tetingkap gelongsor akan mengurangkan yang tidak perlu kerja.
Cari keadaan optimum: Jika masalah mempunyai komponen pengoptimuman (seperti meminimumkan atau memaksimumkan jumlah atau panjang), tetingkap gelongsor mungkin sesuai.
Corak Tetingkap Gelongsor ialah alat yang berkuasa untuk menyelesaikan banyak masalah temu duga pengekodan, terutamanya yang melibatkan jujukan seperti tatasusunan atau rentetan. Dengan menguasai kedua-dua tingkap gelongsor bersaiz tetap dan dinamik, anda boleh menangani pelbagai masalah dengan lebih cekap.
Dalam artikel seterusnya, kami akan meneroka Teknik Dua Penunjuk, satu lagi strategi yang sangat berkesan yang sering melengkapkan pendekatan tetingkap gelongsor dalam masalah yang melibatkan pasangan atau perbandingan antara elemen.
Nantikan Bahagian 3!
Atas ialah kandungan terperinci Memecah Temuduga Pengekodan: Bahagian Corak Tetingkap Gelongsor. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!