Descripción del Título
Dada una matriz nums
, escriba una función para mover todo 0
al final de la matriz manteniendo el orden relativo de los elementos distintos de cero.
Ejemplo:
Entrada:[0,1,0,3,12]
Salida:[1,3,12,0,0]
Descripción :
- Debe operar en la matriz original y no puede copiar matrices adicionales.
- Minimice el número de operaciones.
Solución 1: puntero doble, el primer 0 se intercambia con el primer distinto de cero después de él
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int len = nums.size();
int first0 = -1; //无效的初始index
for (int i = 0; i < len; ++i)
if (0 == nums[i]) {
if (first0 < 0) //寻找第一个0的index
first0 = i;
} else if (first0 >= 0) { //第一个0已找到,且找到第一个0后面第一个非0元素
swap(nums[first0], nums[i]); //把第一个0换成非0元素
i = first0; //从刚才第一个0后面重新找新的第一个0
first0 = -1;
}
}
};
Solución 2: Doble puntero, j registra el índice donde debería estar el elemento distinto de cero, i encuentra el elemento distinto de cero; hay una operación repetida de autointercambio
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int len = nums.size();
int j = 0; //遇非0元素自加
for (int i = 0; i < len; ++i)
if (nums[i])
swap(nums[j++], nums[i]); //把非0元素全部换到前面
}
};
Solución 3: Optimización de la solución 2 para evitar intercambiar valores contigo mismo
//如果元素不为0,i,j跟着一起动。如果元素为零,j记录为零的下标
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int len = nums.size();
int j = 0;
for (int i = 0; i < len; ++i)
if (nums[i]) {
if (i > j) {
nums[j] = nums[i];
nums[i] = 0;
}
++j;
}
}
};