시리즈의 두 번째 부분에서 우리는 코딩 인터뷰 질문을 해결하기위한 가장 다재다능한 패턴 중 하나 인 슬라이딩 창을 해결합니다. 이 기술은 합계, 시퀀스 내에서 특정 조건 찾기 또는 문자열에서 하위 문자열 작업과 같은 연속 요소의 서브 배열 또는 기질과 관련된 문제를 최적화하는 데 매우 유용합니다.
시작하기 전에, 코딩 인터뷰 준비를위한 포괄적 인 안내서를 찾고 있다면, 코딩 인터뷰 크래킹을 확인하는 것을 고려하십시오. 최고의 기술 회사에서 일자리를 얻는 것에 대한 진지한 사람을위한 필수 책인
슬라이딩 윈도우 패턴은 더 큰 데이터 세트 (배열의 서브 배열 또는 문자열의 하위 문자열)에서 데이터의 하위 집합을 고려해야하는 문제를 효율적으로 해결할 수있는 기술입니다. 창을 움직일 때마다 하위 집합을 재 계산하는 대신이 기술은 전체 또는 조건을 유지하여 데이터를 가로 질러 미끄러 져 불필요한 작업을 최소화합니다.
예제 문제
: 정수 배열과 숫자 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_sumdef 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 요소에서 시작하여 배열 끝까지 이동하십시오. IN RANGE (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을 반환합니다
설명
:
예제 문제
: 정수 배열과 숫자 S가 주어지면, 합계보다 큰 연속 서브 어레이를 찾거나
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_sumdef 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보다 크거나 같지만 : Window_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 인 경우 min_length를 반환합니다
설명
:창 경계를 정의합니다 : 창의 시작과 끝을 정의해야합니다.
: 고정 된 Windows의 경우 첫 번째 창의 합계/제품/조건을 초기화합니다. 동적 Windows의 경우 초기 조건은 문제의 목표에 따라 다릅니다.
:
고정 창 크기의 경우 : 다음 요소를 추가하고 더 이상 창에없는 요소를 제거하여 창을 바꾸십시오.: 각 창 이동 후 결과 (예 : 최대 합, 최소 길이 등)를 업데이트하면 필요에 따라
의 최대 합계 서브 어레이.
: 창이 시작하고 끝나야 할 곳을 생각하여 시작하십시오. 이렇게하면 작업중인 정확한 범위를 식별하는 데 도움이됩니다.
를 최적화 한 다음
결론
다음 기사에서는 쌍이나 요소 간의 비교와 관련된 문제에서 슬라이딩 윈도우 접근 방식을 보완하는 또 다른 매우 효과적인 전략 인 두 개의 포인터 기술
을 탐색합니다.부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3