283. Tres soluciones para mover cero dobles punteros

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 :

  1. Debe operar en la matriz original y no puede copiar matrices adicionales.
  2. 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;
            }
    }
};

 

Supongo que te gusta

Origin blog.csdn.net/sy_123a/article/details/108327836
Recomendado
Clasificación