supprimer l'élément
1. Sujet
Lien Leetcode
Vous étant donné un tableau nums et une valeur val, vous devez supprimer tous les éléments dont la valeur est égale à val in place , et renvoyer la nouvelle longueur du tableau supprimé.
N'utilisez pas d'espace de tableau supplémentaire, vous devez utiliser uniquement O(1) O(1)O ( 1 ) espace supplémentaire et modifie le tableau d'entrée sur place.
L'ordre des éléments peut être modifié. Vous n'avez pas besoin de prendre en compte les éléments du tableau au-delà de la nouvelle longueur.
Exemple 1 : étant donné nums = [3,2,2,3], val = 3, la fonction doit renvoyer la nouvelle longueur 2, et les deux premiers éléments de nums sont tous deux 2. Vous n'avez pas besoin de prendre en compte les éléments du tableau au-delà de la nouvelle longueur.
Exemple 2 : étant donné nums = [0,1,2,2,3,0,4,2], val = 2, la fonction doit renvoyer la nouvelle longueur 5, et les cinq premiers éléments en nums sont 0, 1, 3 , 0, 4.
2. Idée
2.1 Solution violente
La solution violente à ce problème consiste en deux couches de boucles for, une boucle for traverse les éléments du tableau et la seconde boucle for met à jour le tableau.
- Complexité temporelle : O ( n 2 ) O(n^2)O ( n2 )
- Complexité spatiale : O ( 1 ) O(1)O ( 1 )
2.2 Méthode du double pointeur
Le pointeur rapide parcourt le tableau et le pointeur lent met à jour le tableau
- Complexité temporelle : O ( n ) O(n)O ( n )
- Complexité spatiale : O ( 1 ) O(1)O ( 1 )
3. Mise en œuvre du code
3.1 Solution violente
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
// 循环遍历数组元素
for (int i = 0; i < size; i++){
if (nums[i] == val){
// 循环更新数组元素
for(int j = i + 1; j < size; j++){
nums[j - 1] = nums[j]; // 注意这里需要更新(删除)的元素从i位置开始
}
// 删除一个元素之后,数组的长度-1, (i+1)位置的元素移到了i位置
i--;
size--;
}
}
return size;
}
};
3.2 Méthode du double pointeur
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int fastIndex = 0;
int slowIndex;
// fastIndex遍历数组元素
for (slowIndex = 0; fastIndex < nums.size(); fastIndex++){
if(nums[fastIndex] != val){
// slowIndex更新数组元素
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
};