Dans cette deuxième partie de notre série, nous plongeons dans l'un des modèles les plus polyvalents pour résoudre les questions d'interview de codage: la fenêtre coulissante. Cette technique est incroyablement utile pour optimiser les problèmes impliquant des sous-réseaux ou des sous-chaînes d'éléments contiguës, tels que la maximisation des sommes, la recherche de conditions spécifiques dans une séquence ou le travail avec des sous-chaînes en chaînes.
Avant de commencer, si vous cherchez un guide complet pour vous préparer au codage des interviews, envisagez de consulter le craquage de l'interview de codage, un livre incontournable pour toute personne sérieuse sur l'atterrissage d'un emploi dans les meilleures entreprises technologiques.
Le modèle de fenêtre coulissante est une technique qui vous permet de résoudre efficacement des problèmes où vous devez considérer un sous-ensemble de données à partir d'un ensemble de données plus large (comme un sous-réseau d'un tableau ou une sous-chaîne d'une chaîne). Au lieu de recalculer le sous-ensemble chaque fois que vous déplacez la fenêtre, cette technique maintient un total ou une condition en cours, glissant sur les données pour minimiser le travail inutile.
Exemple de problème : Étant donné un tableau d'entiers et un nombre k, trouvez la somme maximale de toute sous-réseau de taille 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
Explication:
Exemple de problème : Étant donné un tableau d'entiers et d'un nombre, trouvez le plus petit sous-réseau contigu dont la somme est supérieure ou égale à 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
Explication:
Définissez les limites de la fenêtre : vous devez définir le début et la fin de la fenêtre.
Définissez une condition initiale : Pour les fenêtres fixe, initialisez la somme / produit / condition pour la première fenêtre. Pour les fenêtres dynamiques, la condition initiale dépend de l'objectif du problème.
glisse la fenêtre :
Vérifiez et mettez à jour les résultats : après chaque mouvement de fenêtre, mettez à jour le résultat (tel que la somme maximale, la longueur minimale, etc.) si nécessaire.
Sous-chaîne la plus longue sans répéter les caractères
Subanray maximum de taille de taille k
le plus petit sous-réseau avec une somme donnée
Pensez en termes de limites de la fenêtre : commencez par réfléchir à l'endroit où la fenêtre doit démarrer et se terminer. Cela vous aide à identifier la plage exacte avec laquelle vous travaillez.
Utilisez un hashmap ou un jeu 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 de la fenêtre.
Commencez par Brute-Force, puis optimisez : dans certains problèmes, commencer par une approche de force brute (comme la vérification de chaque sous-réseau possible) peut vous aider à visualiser comment une fenêtre coulissante réduirait un travail inutile.
Recherchez des conditions optimales : Si le problème a un composant d'optimisation (comme minimiser ou maximiser une somme ou une longueur), la fenêtre coulissante peut être un bon ajustement.
Le modèle de fenêtre coulissante est un outil puissant pour résoudre de nombreux problèmes d'entrevue de codage, en particulier ceux impliquant des séquences telles que des tableaux ou des chaînes. En maîtrisant les fenêtres glissantes de taille fixe et dynamiques, vous pouvez résoudre un large éventail de problèmes plus efficacement.
Dans le prochain article, nous explorerons la technique deux pointeurs , une autre stratégie très efficace qui complète souvent l'approche de la fenêtre coulissante dans des problèmes qui impliquent des paires ou des comparaisons entre les éléments.
Restez à l'écoute pour la partie 3!
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3