>웹 프론트엔드 >JS 튜토리얼 >코딩 인터뷰 크래킹: 슬라이딩 윈도우 패턴 부분

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

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-11 10:34:29681검색

Cracking the Coding Interview: Part  The Sliding Window Pattern

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

시작하기 전에 코딩 인터뷰 준비를 위한 포괄적인 가이드를 찾고 있다면 일류 기술 회사에 취업하기를 진지하게 생각하는 사람이라면 꼭 읽어야 할 책인 Cracking the Coding Interview를 확인해 보세요.

슬라이딩 윈도우 패턴 개요

슬라이딩 윈도우 패턴은 더 큰 데이터 세트(예: 배열의 하위 배열 또는 문자열의 하위 문자열)에서 데이터의 하위 집합을 고려해야 하는 문제를 효율적으로 해결할 수 있는 기술입니다. 창을 이동할 때마다 하위 집합을 다시 계산하는 대신 이 기술은 누계 또는 조건을 유지하여 데이터를 슬라이드하여 불필요한 작업을 최소화합니다.

슬라이딩 윈도우를 사용하는 경우:
  • 연속된 하위 배열 또는 하위 문자열과 관련된 문제입니다.
  • 데이터세트의 슬라이딩 범위 내에서 최대 또는 최소 합계, 개수 또는 기타 조건을 찾아야 합니다.
  • 고정된 창 크기가 필요하거나 확장 또는 축소되는 동적 창이 필요합니다.

슬라이딩 윈도우 접근 방식의 유형

1. 고정 크기 슬라이딩 윈도우

  • 정의: 합계나 곱과 같은 실행 상태를 유지하면서 배열이나 문자열을 가로질러 미끄러지는 고정된 크기의 창입니다.
  • : 크기 k인 하위 배열의 최대 합을 구합니다.

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

설명:

  • k 크기의 창이 초기화됩니다.
  • 창이 배열을 가로질러 이동할 때 더 이상 창에 없는 요소를 빼고 창에 들어가는 새 요소를 추가하여 슬라이딩 효과를 얻을 수 있습니다.
  • 이는 더 이상 각 반복에 대해 전체 창을 합산할 필요가 없으므로 O(n*k)에서 O(n)까지의 무차별 접근 방식에서 문제를 최적화합니다.

2. 동적 슬라이딩 윈도우

  • 설명: 창 크기가 고정되어 있지 않을 때 사용됩니다. 문제의 요구 사항(예: 합계 또는 조건 충족)에 따라 창이 확장되거나 축소됩니다.
  • : 합이 S보다 크거나 같은 가장 작은 하위 배열을 찾습니다.

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

설명:

  • 합계가 S를 초과하거나 같아질 때까지 window_end를 늘려 창을 확장합니다.
  • 조건이 충족되면 최소 하위 배열 크기를 찾기 위해 창이 왼쪽(window_start)부터 축소되기 시작합니다.
  • 이 접근 방식은 재계산을 방지하여 문제를 O(n^2)에서 O(n)으로 줄이므로 효율적입니다.

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

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

  2. 초기 조건 설정: 고정 창의 경우 첫 번째 창에 대한 합계/곱/조건을 초기화합니다. 동적 창의 경우 초기 조건은 문제의 목적에 따라 다릅니다.

  3. 창 슬라이드:

    • 고정된 창 크기의 경우: 다음 요소를 추가하고 더 이상 창에 없는 요소를 제거하여 창을 이동합니다.
    • 동적 창의 경우: 만족하려는 조건에 따라 창을 확장하거나 축소합니다.
  4. 결과 확인 및 업데이트: 각 창 이동 후 필요에 따라 결과(예: 최대 합계, 최소 길이 등)를 업데이트합니다.


슬라이딩 윈도우를 사용한 일반적인 면접 질문

  1. 반복 문자가 없는 가장 긴 부분 문자열

    • 문제: 문자열 s가 주어졌을 때, 반복되는 문자가 없는 가장 긴 부분 문자열의 길이를 구하세요.
    • 패턴: 동적 슬라이딩 창을 사용하여 중복 문자를 찾을 때까지 확장한 다음 조건이 만족될 때까지 창을 축소합니다.
  2. K 크기의 최대 합 하위 배열

    • Masalah: Diberi tatasusunan integer dan integer k, cari jumlah maksimum mana-mana subray bersaiz k.
    • Corak: Gunakan tetingkap gelongsor saiz tetap untuk mengekalkan jumlah elemen k dan mengemas kini jumlah maksimum semasa anda meluncur tetingkap merentasi tatasusunan.
  3. Subarray Terkecil dengan Jumlah Diberi

    • Masalah: Diberi tatasusunan integer positif dan nombor S, cari panjang subarray bersebelahan terkecil yang jumlahnya lebih besar daripada atau sama dengan S.
    • Corak: Gunakan tetingkap gelongsor dinamik yang mengembang untuk mencari subarray yang sah dan mengecut untuk meminimumkan panjangnya.

Peretasan Tetingkap Gelongsor untuk Temuduga

  1. 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.

  2. Gunakan peta cincang atau set untuk tetingkap dinamik: Apabila berurusan dengan subrentetan atau elemen unik, gunakan set untuk menjejaki elemen dalam tetingkap.

  3. 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.

  4. Cari keadaan optimum: Jika masalah mempunyai komponen pengoptimuman (seperti meminimumkan atau memaksimumkan jumlah atau panjang), tetingkap gelongsor mungkin sesuai.


Kesimpulan

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.