Maison > interface Web > js tutoriel > Méditations LeetCode : Insérer un intervalle

Méditations LeetCode : Insérer un intervalle

Barbara Streisand
Libérer: 2025-01-04 14:21:40
original
588 Les gens l'ont consulté

LeetCode Meditations: Insert Interval

La description d'Insérer un intervalle est assez explicative :

Vous recevez un tableau d'intervalles qui ne se chevauchent pas où intervals[i] = [start_i, end_i] représentent le début et la fin du ième intervalle et les intervalles sont triés par ordre croissant par start_i. Vous recevez également un intervalle newInterval = [start, end] qui représente le début et la fin d'un autre intervalle.

Insérez newInterval dans les intervalles de telle sorte que les intervalles soient toujours triés par ordre croissant par start_i et que les intervalles n'aient toujours pas d'intervalles qui se chevauchent (fusionnez les intervalles qui se chevauchent si nécessaire).

Intervalles de retour après l'insertion.

Notez que vous n'avez pas besoin de modifier les intervalles sur place. Vous pouvez créer un nouveau tableau et le renvoyer.

Par exemple :

Input: intervals = [[1, 3], [6, 9]], newInterval = [2, 5]
Output: [[1, 5], [6, 9]]
Copier après la connexion
Copier après la connexion

Ou :

Input: intervals = [[1, 2], [3, 5], [6, 7], [8, 10], [12, 16]], newInterval = [4, 8]
Output: [[1, 2], [3, 10], [12, 16]]

Explanation: Because the new interval [4, 8] overlaps with [3, 5], [6, 7], [8, 10].
Copier après la connexion

Nous pouvons commencer par créer un tableau de résultats pour contenir, eh bien, le résultat :

let result = [];
Copier après la connexion

Ensuite, en parcourant tous les intervalles, nous devons vérifier si nous devons placer notre nouvel intervalle avant ou après l'intervalle actuel, ou, s'ils se chevauchent et doivent donc être fusionnés.

Comme nous l'avons vu dans l'introduction du chapitre, deux intervalles ne se chevauchent si le début de l'un est strictement plus grand que la fin de l'autre, ou, si la fin de l'un est strictement inférieure que le début de l'autre.

Lorsque ces deux cas sont faux, ils se chevauchent.

Tout d'abord, nous pouvons vérifier si newInterval arrive avant l'intervalle. En fait, si nous vérifions d'abord cela (la position "la plus précoce" que nous puissions trouver pour placer newInterval), nous pouvons revenir immédiatement avec notre résultat nouvellement construit.
C'est aussi ça l'approche gourmande.

for (let i = 0; i < intervals.length; i++) {
  const interval = intervals[i];

  // newInterval is before interval
  if (newInterval[1] < interval[0]) {
    result.push(newInterval);
    return [...result, ...intervals.slice(i)];
  }
  /* ... */  
}
Copier après la connexion

Cependant, si newInterval vient après l'intervalle actuel que nous examinons, nous pouvons simplement pousser l'intervalle actuel vers notre résultat :

for (let i = 0; i < intervals.length; i++) {
  /* ... */
  // newInterval is after interval
  else if (newInterval[0] > interval[1]) {
    result.push(interval);
  }
}
Copier après la connexion

La dernière option est lorsqu'ils se chevauchent, dans ce cas, nous devons fusionner les deux intervalles. Nous pouvons créer à nouveau newInterval avec la valeur minimale des intervalles comme début, et leur valeur maximale comme fin du nouvel intervalle :

for (let i = 0; i < intervals.length; i++) {
  /* ... */
  // overlapping, create newInterval
  else {
    newInterval = [
      Math.min(newInterval[0], interval[0]),
      Math.max(newInterval[1], interval[1])
    ];
  }
}
Copier après la connexion

Notre boucle ressemble actuellement à ceci :

for (let i = 0; i < intervals.length; i++) {
  const interval = intervals[i];

  // newInterval is before interval
  if (newInterval[1] < interval[0]) {
    result.push(newInterval);
    return [...result, ...intervals.slice(i)] 

  // newInterval is after interval
  } else if (newInterval[0] > interval[1]) {
    result.push(interval);

  // overlapping, create newInterval
  } else {
    newInterval = [Math.min(newInterval[0], interval[0]), Math.max(newInterval[1], interval[1])];
  }
}
Copier après la connexion

Nous devons également pousser le dernier newInterval que nous avons créé. Et, à la fin, on peut simplement renvoyer le résultat :

function insert(intervals: number[][], newInterval: number[]): number[][] {
  /* ... */
  result.push(newInterval);
  return result;
}
Copier après la connexion

Finalement, la solution ressemble à ceci :

Input: intervals = [[1, 3], [6, 9]], newInterval = [2, 5]
Output: [[1, 5], [6, 9]]
Copier après la connexion
Copier après la connexion

Complexité temporelle et spatiale

La complexité temporelle sera O(n)O(n) O(n) comme nous effectuons des opérations constantes pour chaque élément du tableau d'intervalles. La complexité spatiale sera O(n)O(n) O(n) De plus, nous conservons un tableau de résultats et sa taille augmentera à mesure que la longueur des intervalles augmente.


Ensuite, nous examinerons les intervalles de fusion. En attendant, bon codage.

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