La description des intervalles sans chevauchement est :
Étant donné un tableau d'intervalles intervalles où intervalles[i] = [start_i, end_i], renvoie le nombre minimum d'intervalles que vous devez supprimer pour que le reste des intervalles ne se chevauchent pas.
Notez que les intervalles qui ne se touchent qu'en un point sont ne se chevauchent pas. Par exemple, [1, 2] et [2, 3] ne se chevauchent pas.
Par exemple :
Input: intervals = [[1, 2], [2, 3], [3, 4], [1, 3]] Output: 1 Explanation: [1, 3] can be removed and the rest of the intervals are non-overlapping.
Ou :
Input: intervals = [[1, 2], [1, 2], [1, 2]] Output: 2 Explanation: You need to remove two [1, 2] to make the rest of the intervals non-overlapping.
Ou :
Input: intervals = [[1, 2], [2, 3]] Output: 0 Explanation: You don't need to remove any of the intervals since they're already non-overlapping.
Pour ce problème, NeetCode propose une excellente solution qui commence par trier les intervalles, comme nous l'avons fait dans le problème précédent.
Nous pouvons également initialiser une variable pour suivre le nombre de suppressions.
intervals.sort((a, b) => a[0] - b[0]); let numRemovals = 0;
Maintenant que nos intervalles sont triés, nous allons les parcourir chacun, en vérifiant s'ils se chevauchent ou non. Nous garderons une trace de la fin de l'intervalle précédent pour cela, initialisons donc une variable prevEnd qui contient initialement la fin du premier intervalle :
let prevEnd = intervals[0][1];
Note |
---|
For two intervals not to overlap, the start of one should be strictly larger than the end of the other or the end of the one should be strictly smaller than the start of the other, as mentioned in our chapter introduction. |
Dans ce problème, lorsque la fin d'un intervalle est égale au début de l'autre, elles sont considérées comme ne se chevauchant pas.
On peut donc dire ici que deux intervalles se chevaucheront si le début de l'un est strictement inférieur à la fin de l'autre. Dans ce cas, nous mettrons à jour prevEnd pour qu'il soit la plus petite valeur des deux extrémités afin d'avoir moins de chances de chevaucher l'intervalle suivant. Sinon, on continue comme avant :
Input: intervals = [[1, 2], [2, 3], [3, 4], [1, 3]] Output: 1 Explanation: [1, 3] can be removed and the rest of the intervals are non-overlapping.
Enfin, nous pouvons renvoyer numRemovals :
Input: intervals = [[1, 2], [1, 2], [1, 2]] Output: 2 Explanation: You need to remove two [1, 2] to make the rest of the intervals non-overlapping.
Et la solution finale que nous avons ressemble à ceci :
Input: intervals = [[1, 2], [2, 3]] Output: 0 Explanation: You don't need to remove any of the intervals since they're already non-overlapping.
Puisque nous trions les intervalles au début, la complexité temporelle sera O(n log n) . Nous n'avons pas de structure de données supplémentaire dont la taille augmentera à mesure que la taille d'entrée augmente, donc la complexité spatiale est O(1) .
Ensuite, nous commencerons le dernier chapitre de la série, Bit Manipulation. 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!