Maison >interface Web >js tutoriel >Décrypter l'entretien de codage : partie du modèle de fenêtre coulissante

Décrypter l'entretien de codage : partie du modèle de fenêtre coulissante

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-10-11 10:34:29681parcourir

Cracking the Coding Interview: Part  The Sliding Window Pattern

Dalam bahagian kedua siri kami ini, kami menyelami salah satu corak yang paling serba boleh untuk menyelesaikan soalan temu bual pengekodan: Tetingkap Gelongsor. Teknik ini amat berguna untuk mengoptimumkan masalah yang melibatkan subarray atau subrentetan unsur bersebelahan, seperti memaksimumkan jumlah, mencari keadaan khusus dalam jujukan atau bekerja dengan subrentetan dalam rentetan.

Sebelum kita bermula, jika anda mencari panduan komprehensif untuk menyediakan temu duga pengekodan, pertimbangkan untuk menyemak Temuduga Pemecahan Pengekodan, buku yang mesti dimiliki oleh sesiapa yang serius untuk mendapatkan pekerjaan di syarikat teknologi terkemuka.

Gambaran Keseluruhan Corak Tetingkap Gelongsor

Corak Tetingkap Gelongsor ialah teknik yang membolehkan anda menyelesaikan masalah dengan cekap di mana anda perlu mempertimbangkan subset data daripada set data yang lebih besar (seperti subarray tatasusunan atau subrentetan rentetan). Daripada mengira semula subset setiap kali anda mengalihkan tetingkap, teknik ini mengekalkan jumlah atau keadaan yang sedang berjalan, meluncur merentasi data untuk meminimumkan kerja yang tidak perlu.

Bila Menggunakan Tetingkap Gelongsor:
  • Masalahnya melibatkan subarray atau subrentetan bersebelahan.
  • Anda perlu mencari jumlah maksimum atau minimum, kiraan atau syarat lain dalam julat gelongsor set data.
  • Ia melibatkan saiz tetingkap tetap atau memerlukan tetingkap dinamik yang mengembang atau mengecut.

Jenis Pendekatan Tingkap Gelongsor

1. Tetingkap Gelongsor Saiz Tetap

  • Apakah itu: Tetingkap dengan saiz tetap yang meluncur merentasi tatasusunan atau rentetan sambil mengekalkan keadaan berjalan seperti jumlah atau produk.
  • Contoh: Cari jumlah maksimum subarray saiz k.

Contoh Masalah: Diberi tatasusunan integer dan nombor k, cari jumlah maksimum mana-mana subbaris saiz 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

Penjelasan:

  • Tetingkap saiz k dimulakan.
  • Apabila tetingkap bergerak merentasi tatasusunan, kesan gelongsor dicapai dengan menolak elemen yang tiada lagi dalam tetingkap dan menambah elemen baharu yang memasuki tetingkap.
  • Ini mengoptimumkan masalah daripada pendekatan kekerasan O(n*k) kepada O(n), kerana kita tidak perlu lagi merumuskan keseluruhan tetingkap untuk setiap lelaran.

2. Tetingkap Gelongsor Dinamik

  • Apa itu: Ini digunakan apabila saiz tetingkap tidak ditetapkan. Tetingkap mengembang atau mengecut berdasarkan keperluan masalah (seperti memenuhi jumlah atau syarat).
  • Contoh: Cari subarray terkecil dengan jumlah lebih besar daripada atau sama dengan S.

Contoh Masalah: Diberi tatasusunan integer dan nombor S, cari subray bersebelahan terkecil yang jumlahnya lebih besar daripada atau sama dengan 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

Penjelasan:

  • Tetingkap mengembang dengan meningkatkan window_end sehingga jumlah melebihi atau sama dengan S.
  • Setelah syarat dipenuhi, tetingkap mula mengecut dari kiri (window_start) untuk mencari saiz subarray minimum.
  • Pendekatan ini cekap kerana ia mengurangkan masalah daripada O(n^2) kepada O(n), dengan mengelakkan pengiraan semula.

Langkah-langkah untuk Melaksanakan Penyelesaian Tetingkap Gelongsor

  1. Tentukan sempadan tetingkap: Anda perlu menentukan permulaan dan penghujung tetingkap.

  2. Tetapkan syarat awal: Untuk tetingkap tetap, mulakan jumlah/produk/syarat untuk tetingkap pertama. Untuk tetingkap dinamik, keadaan awal bergantung pada matlamat masalah.

  3. Gelongsor tingkap:

    • Untuk saiz tetingkap tetap: Alihkan tetingkap dengan menambah elemen seterusnya dan mengalih keluar elemen yang tiada lagi dalam tetingkap.
    • Untuk tetingkap dinamik: Kembangkan atau kecutkan tetingkap berdasarkan syarat yang anda cuba penuhi.
  4. Semak dan kemas kini keputusan: Selepas setiap pergerakan tetingkap, kemas kini keputusan (seperti jumlah maksimum, panjang minimum, dsb.) seperti yang diperlukan.


Soalan Temuduga Biasa Menggunakan Tetingkap Gelongsor

  1. Sarisari terpanjang Tanpa Aksara Berulang

    • Masalah: Diberi rentetan s, cari panjang subrentetan terpanjang tanpa mengulang aksara.
    • Corak: Gunakan tetingkap gelongsor dinamik untuk mengembangkan sehingga aksara pendua ditemui, kemudian kecutkan tetingkap tersebut sehingga syaratnya dipenuhi.
  2. Subarray Jumlah Maksimum Saiz K

    • Problème : Étant donné un tableau d'entiers et un entier k, trouvez la somme maximale de tout sous-tableau de taille k.
    • Modèle : utilisez une fenêtre coulissante de taille fixe pour conserver la somme de k éléments et mettez à jour la somme maximale lorsque vous faites glisser la fenêtre sur le tableau.
  3. Le plus petit sous-tableau avec une somme donnée

    • Problème : Étant donné un tableau d'entiers positifs et un nombre S, trouver la longueur du plus petit sous-tableau contigu dont la somme est supérieure ou égale à S.
    • Modèle : utilisez une fenêtre coulissante dynamique qui s'agrandit pour trouver un sous-tableau valide et se contracte pour minimiser sa longueur.

Hacks de fenêtre coulissante pour les entretiens

  1. Pensez en termes de limites de fenêtre : Commencez par réfléchir à l'endroit où la fenêtre doit commencer et se terminer. Cela vous aide à identifier la plage exacte avec laquelle vous travaillez.

  2. Utilisez un hashmap ou un ensemble pour les fenêtres dynamiques : Lorsque vous traitez des sous-chaînes ou des éléments uniques, utilisez un ensemble pour suivre les éléments dans la fenêtre.

  3. Commencez par la force brute, puis optimisez : Dans certains problèmes, commencer par une approche par force brute (comme vérifier tous les sous-tableaux possibles) peut vous aider à visualiser comment une fenêtre coulissante réduirait les travail.

  4. Recherchez les conditions optimales : Si le problème comporte un composant d'optimisation (comme minimiser ou maximiser une somme ou une longueur), la fenêtre coulissante peut être une bonne solution.


Conclusion

Le modèle de fenêtre coulissante est un outil puissant pour résoudre de nombreux problèmes d'entretien de codage, en particulier ceux impliquant des séquences telles que des tableaux ou des chaînes. En maîtrisant à la fois les fenêtres coulissantes de taille fixe et dynamiques, vous pouvez résoudre plus efficacement un large éventail de problèmes.

Dans le prochain article, nous explorerons la Technique à deux pointeurs, une autre stratégie très efficace qui complète souvent l'approche par fenêtre glissante dans les problèmes impliquant des paires ou des comparaisons entre éléments.

Restez à l'écoute pour la partie 3 !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn