"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 코딩 인터뷰 크래킹 : 슬라이딩 윈도우 패턴의 일부

코딩 인터뷰 크래킹 : 슬라이딩 윈도우 패턴의 일부

2025-03-04에 게시되었습니다
검색:212

Cracking the Coding Interview: Part  The Sliding Window Pattern

시리즈의 두 번째 부분에서 우리는 코딩 인터뷰 질문을 해결하기위한 가장 다재다능한 패턴 중 하나 인 슬라이딩 창을 해결합니다. 이 기술은 합계, 시퀀스 내에서 특정 조건 찾기 또는 문자열에서 하위 문자열 작업과 같은 연속 요소의 서브 배열 또는 기질과 관련된 문제를 최적화하는 데 매우 유용합니다.

시작하기 전에, 코딩 인터뷰 준비를위한 포괄적 인 안내서를 찾고 있다면, 코딩 인터뷰 크래킹을 확인하는 것을 고려하십시오. 최고의 기술 회사에서 일자리를 얻는 것에 대한 진지한 사람을위한 필수 책인

슬라이딩 윈도우 패턴의 개요

슬라이딩 윈도우 패턴은 더 큰 데이터 세트 (배열의 서브 배열 또는 문자열의 하위 문자열)에서 데이터의 하위 집합을 고려해야하는 문제를 효율적으로 해결할 수있는 기술입니다. 창을 움직일 때마다 하위 집합을 재 계산하는 대신이 기술은 전체 또는 조건을 유지하여 데이터를 가로 질러 미끄러 져 불필요한 작업을 최소화합니다.
슬라이딩 윈도우를 사용할 때 :
  • 문제는 인접한 서브 사업 또는 하위 문자열과 관련이 있습니다.
  • 데이터 세트의 슬라이딩 범위 내에서 최대 또는 최소 합 또는 기타 조건을 찾아야합니다.
  • 고정 된 창 크기가 포함되거나 확장 또는 축소되는 동적 창이 필요합니다.

슬라이딩 윈도우의 유형

1. 고정 크기 슬라이딩 창

  • 그것이 무엇인가
  • : 합 또는 제품과 같은 실행 조건을 유지하면서 배열이나 문자열을 가로 질러 슬라이스하는 고정 된 크기의 창.
  • example
  • : size subarray의 최대 합을 찾으십시오.

예제 문제
: 정수 배열과 숫자 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

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 요소에서 시작하여 배열 끝까지 이동하십시오. 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을 반환합니다

설명

:
  • 크기 k의 창이 초기화됩니다.
  • 창이 배열을 가로 질러 이동함에 따라 더 이상 창에없는 요소를 빼고 창에 들어가는 새로운 요소를 추가하여 슬라이딩 효과가 달성됩니다.
  • 이것은 각 반복에 대한 전체 창을 더 이상 요약 할 필요가 없기 때문에 O (n*k)의 무차별 인력 접근에서 O (n)으로 문제를 최적화합니다.

2. 동적 슬라이딩 창

  • 그것이 무엇인지
  • : 이것은 창 크기가 고정되어 있지 않을 때 사용됩니다. 창은 문제의 요구 사항에 따라 (합계 또는 조건을 만족시키는 등) 확장 또는 계약을 확장합니다.
  • example
  • : s.
보다 더 큰 합을 가진 가장 작은 서브 어레이를 찾으십시오.

예제 문제
: 정수 배열과 숫자 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_sum

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보다 크거나 같지만 : 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를 반환합니다

설명

:
  • SUM이 s.
  • 조건이 충족되면 창이 왼쪽 (Window_start)에서 계약을 시작하여 최소 서브 어레이 크기를 찾습니다.
  • 이 접근법은 재 계산을 피함으로써 O (n^2)에서 O (n)으로 문제를 줄이기 때문에 효율적입니다.

슬라이딩 윈도우 솔루션을 구현하는 단계

  1. 창 경계를 정의합니다 : 창의 시작과 끝을 정의해야합니다.

  2. 초기 조건을 설정

    : 고정 된 Windows의 경우 첫 번째 창의 합계/제품/조건을 초기화합니다. 동적 Windows의 경우 초기 조건은 문제의 목표에 따라 다릅니다.

  3. 창을 밀어 넣습니다

    :

    고정 창 크기의 경우 : 다음 요소를 추가하고 더 이상 창에없는 요소를 제거하여 창을 바꾸십시오.
    • Dynamic Windows의 경우 : 만족하려는 조건에 따라 창을 확장하거나 계약합니다.
  4. 결과를 확인하고 업데이트하고 업데이트

    : 각 창 이동 후 결과 (예 : 최대 합, 최소 길이 등)를 업데이트하면 필요에 따라

슬라이딩 창을 사용한 일반적인 인터뷰 질문

  1. 캐릭터를 반복하지 않고 가장 긴 하위 문자

      문제
    • : 문자열 s가 주어지면, 반복하는 문자없이 가장 긴 부분 문자열의 길이를 찾으십시오.
    • Pattern
    • : 동적 슬라이딩 창을 사용하여 중복 문자가 발견 될 때까지 확장 한 다음 조건이 충족 될 때까지 창을 수축시킵니다.
  2. size k

    의 최대 합계 서브 어레이.

      문제
    • : 정수 배열과 정수 k가 주어지면 크기 k의 하위 배열의 최대 합을 찾으십시오.
    • Pattern
    • : 고정 크기 슬라이딩 창을 사용하여 K 요소의 합을 유지하고 배열을 가로 질러 창을 밀면 최대 합을 업데이트합니다.
  3. 주어진 합이있는 가장 작은 서브 어레이

      문제
    • : 양의 정수 배열과 숫자 S가 주어지면, 합계보다 크거나 동일한 가장 작은 연속 서브 어레이의 길이를 찾으십시오.
    • Pattern
    • : 유효한 서브 어레이와 계약을 찾아 길이를 최소화하기 위해 확장하는 동적 슬라이딩 창을 사용합니다.
인터뷰를위한 슬라이딩 윈도우 해킹

  1. 창 경계면에서 생각

    : 창이 시작하고 끝나야 할 곳을 생각하여 시작하십시오. 이렇게하면 작업중인 정확한 범위를 식별하는 데 도움이됩니다.

  2. 를 최적화 한 다음
  3. 를 최적화합니다. 일부 문제에서는 Brute-Force 접근 방식으로 시작하여 (가능한 모든 서브 어레이를 확인하는 것과 같은) 슬라이딩 창이 불필요한 작업을 줄이는 방법을 시각화하는 데 도움이 될 수 있습니다.
  4. 결론
  5. 슬라이딩 윈도우 패턴은 많은 코딩 인터뷰 문제, 특히 배열이나 문자열과 같은 시퀀스와 관련된 문제를 해결하기위한 강력한 도구입니다. 고정 크기 및 동적 슬라이딩 창을 모두 마스터하면 광범위한 문제를보다 효율적으로 해결할 수 있습니다.

    다음 기사에서는 쌍이나 요소 간의 비교와 관련된 문제에서 슬라이딩 윈도우 접근 방식을 보완하는 또 다른 매우 효과적인 전략 인 두 개의 포인터 기술

    을 탐색합니다.
Part 3에 대해 계속 지켜봐주십시오!

릴리스 선언문 이 기사는 https://dev.to/zzeroyzz/cracking-the-coding-interview-part-2-the-slidow-pattern-520d에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3