Maison > développement back-end > tutoriel php > . Somme maximale des sous-tableaux qui se chevauchent

. Somme maximale des sous-tableaux qui se chevauchent

Barbara Streisand
Libérer: 2024-12-30 10:24:10
original
1037 Les gens l'ont consulté

. Maximum Sum of on-Overlapping Subarrays

689. Somme maximale de 3 sous-tableaux qui ne se chevauchent pas

Difficulté : Difficile

Sujets :Array, programmation dynamique

Étant donné un tableau d'entiers nums et un entier k, trouvez trois sous-tableaux qui ne se chevauchent pas de longueur k avec une somme maximale et renvoyez-les.

Renvoyer le résultat sous forme de liste d'indices représentant la position de départ de chaque intervalle (0-indexé). S'il y a plusieurs réponses, renvoyez la plus petite lexicographiquement.

Exemple 1 :

  • Entrée : nums = [1,2,1,2,6,7,5,1], k = 2
  • Sortie : [0,3,5]
  • Explication : Les sous-tableaux [1, 2], [2, 6], [7, 5] correspondent aux indices de départ [0, 3, 5].
    • Nous aurions également pu prendre [2, 1], mais une réponse de [1, 3, 5] serait lexicographiquement plus grande.

Exemple 2 :

  • Entrée : nums = [1,2,1,2,1,2,1,2,1], k = 2
  • Sortie : [0,2,4]

Contraintes :

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] < 216
  • 1 <= k <= étage(nums.length / 3)

Solution :

Nous utiliserons une approche de programmation dynamique. L'idée est de décomposer le problème en sous-problèmes plus petits, en tirant parti du chevauchement des sous-tableaux pour calculer efficacement la somme maximale de trois sous-tableaux non chevauchants de longueur k.

Approche:

  1. Précalculez les sommes des sous-tableaux de longueur k :
    Tout d’abord, nous calculons la somme de tous les sous-tableaux de longueur k dans le tableau d’entrée nums. Cela peut être fait efficacement en temps linéaire en utilisant une technique de fenêtre glissante.

  2. Programmation dynamique (DP) :
    Nous créons deux tableaux auxiliaires, gauche et droite, pour stocker les indices des meilleurs sous-tableaux trouvés jusqu'à la position actuelle. Le left[i] stockera l'index du meilleur sous-tableau se terminant avant l'index i, et le right[i] stockera l'index du meilleur sous-tableau commençant après l'index i.

  3. Itérer et calculer la somme maximale :
    Pour chaque sous-tableau intermédiaire possible commençant à l'index j, nous calculons la somme totale en considérant le meilleur sous-tableau gauche avant j et le meilleur sous-tableau droit après j.

  4. Ordre lexicographique :
    S'il y a plusieurs réponses valides (avec la même somme), nous renvoyons la plus petite lexicographiquement. Ceci est assuré par l'ordre d'itération.

Implémentons cette solution en PHP : 689. Somme maximale de 3 sous-tableaux qui ne se chevauchent pas

<?php
/**
 * @param Integer[] $nums
 * @param Integer $k
 * @return Integer[]
 */
function maxSumOfThreeSubarrays($nums, $k) {
    ...
    ...
    ...
    /**
     * go to ./solution.php
     */
}

// Test cases
print_r(maxSumOfThreeSubarrays([1,2,1,2,6,7,5,1], 2)); // [0, 3, 5]
print_r(maxSumOfThreeSubarrays([1,2,1,2,1,2,1,2,1], 2)); // [0, 2, 4]
?>




<h3>
  
  
  Explication:
</h3>

<ol>
<li>
<p><strong>Calcul des sommes des sous-tableaux :</strong></p>

<ul>
<li>Nous calculons la somme de tous les sous-tableaux possibles de longueur k. Cela se fait en calculant d’abord la somme des k premiers éléments. Ensuite, pour chaque position suivante, nous soustrayons l'élément laissé et ajoutons l'élément suivant dans le tableau, ce qui en fait une approche de fenêtre coulissante efficace.</li>
</ul>
</li>
<li>
<p><strong>Tableaux gauche et droit :</strong></p>

<ul>
<li>
left[i] contient l'index du sous-tableau avec la somme maximale qui se termine avant l'index i.</li>
<li>
right[i] contient l'index du sous-tableau avec la somme maximale qui commence après l'index i.</li>
</ul>
</li>
<li>
<p><strong>Calcul final :</strong></p>

<ul>
<li>Pour chaque sous-tableau du milieu j, nous vérifions la combinaison du meilleur sous-tableau gauche et du meilleur sous-tableau droit, et mettons à jour le résultat si la somme est supérieure au maximum actuel.</li>
</ul>
</li>
<li>
<p><strong>Réponse lexicographiquement la plus petite :</strong></p>

<ul>
<li>En itérant de gauche à droite, nous garantissons la solution lexicographiquement la plus petite en choisissant naturellement les premiers sous-tableaux qui donnent la somme maximale.</li>
</ul>
</li>
</ol>

<h3>
  
  
  Exemple:
</h3>

<p>Pour la saisie :<br>
</p>

<pre class="brush:php;toolbar:false">$nums = [1, 2, 1, 2, 6, 7, 5, 1];
$k = 2;
Copier après la connexion

Le résultat sera :

[0, 3, 5]
Copier après la connexion

Cette approche garantit que la complexité temporelle reste efficace, avec une complexité temporelle d'environ O(n), où n est la longueur des nombres du tableau d'entrée.

Liens de contact

Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !

Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :

  • LinkedIn
  • GitHub

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!

source:dev.to
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal