시리즈의 두 번째 부분에서는 코딩 면접 질문을 해결하는 가장 다양한 패턴 중 하나인 슬라이딩 윈도우에 대해 알아봅니다. 이 기술은 합계 최대화, 시퀀스 내의 특정 조건 찾기 또는 문자열의 하위 문자열 작업과 같이 인접한 요소의 하위 배열 또는 하위 문자열과 관련된 문제를 최적화하는 데 매우 유용합니다.
시작하기 전에 코딩 인터뷰 준비를 위한 포괄적인 가이드를 찾고 있다면 일류 기술 회사에 취업하기를 진지하게 생각하는 사람이라면 꼭 읽어야 할 책인 Cracking the Coding Interview를 확인해 보세요.
슬라이딩 윈도우 패턴은 더 큰 데이터 세트(예: 배열의 하위 배열 또는 문자열의 하위 문자열)에서 데이터의 하위 집합을 고려해야 하는 문제를 효율적으로 해결할 수 있는 기술입니다. 창을 이동할 때마다 하위 집합을 다시 계산하는 대신 이 기술은 누계 또는 조건을 유지하여 데이터를 슬라이드하여 불필요한 작업을 최소화합니다.
예제 문제: 정수 배열과 숫자 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!
위 내용은 코딩 인터뷰 크래킹: 슬라이딩 윈도우 패턴 부분의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!