pregunta de código leet 53-suma máxima de suborden

Titulo:

Dada una matriz de enteros  nums , encuentre una matriz secundaria continua con la suma más grande (la matriz secundaria contiene al menos un elemento) y devuelva la suma más grande.

Ejemplos:

Entrada: [ -2 , 1 , -3 , 4 , -1 , 2 , 1 , -5 , 4 ], 
Salida: 6 
Explicación: La suma de sub-matrices consecutivas [ 4 , -1 , 2 , 1 ] es la más grande, que es 6 .

La primera vez que recibí esta pregunta por primera vez, la idea más directa es: recorrer toda la matriz, encontrar todas sus subsecuencias y luego encontrar la más grande. La idea general es, naturalmente, usar dos índices i, j, y luego obtener el valor de la matriz entre i, j, y luego usar el método de anillo para obtener el mayor; la complejidad temporal de este método es o (n ^ 2).

¿Hay una mejor manera? ¿O podemos encontrar una estrategia para que el próximo resultado sea mayor que la última vez, de modo que solo necesitemos atravesar la matriz una vez?

Por supuesto, esta idea es: si la suma de la secuencia actual es negativa, entonces la siguiente busca la posición inicial. ¡Ya no contiene la posición actual y el número de posiciones anteriores !

Utilizamos esta idea para analizar la matriz de ejemplo anterior: [-2,1, -3,4, -1,2,1, -5,4],

1 Primera vez: secuencia actual y suma = -2 < 0 ; por lo tanto, ya no se considera el número de posición 0
 2 Segunda vez: secuencia actual y suma = 1   > 0 ; entonces el máximo actual y max_sum = 1 ; considere el número de posición 1
 3 La tercera vez: la secuencia actual y la suma = 1 + -3 = -2 < 0 ; por lo tanto, el número anterior a - 3 ya no se considera ;
 4 la cuarta vez: la secuencia actual y la suma = 4 > 0 ; luego el máximo actual y sum_max = 4 ; la secuencia máxima en este momento es 4;
 5 la quinta vez: la secuencia actual y la suma = 4 + -1 = 3 > 0 ; entonces el máximo actual y sum_max = 4 ; la secuencia máxima en este momento es 4; pero porque suma> 0, Todavía necesitamos considerar 4 como el punto de partida
 6 por sexta vez: la secuencia actual y la suma = 4 + -1 + 2 = 5 > 0 ; la secuencia máxima actual y sum_max = 5 ; la secuencia máxima en este momento [ 4 , -1 , 2 ];
 7 séptima: = secuencia actual y SUM 4 + - 1 + 2 + 1 = . 6 > 0 ; y la secuencia corriente máxima = sum_max . 6 ; el caso secuencia máxima [ 4 - 1 , 2 , 1 ];
 8 segundos Ocho veces: secuencia actual y suma =   4 + -1 + 2+ 1 + -5 = 1 > 0 ; sum_max = 6 ; la secuencia máxima en este momento [ 4 , -1 , 2 , 1 ];
 9 noveno: la secuencia actual y suma =   4 + -1 + 2 + 1 + -5 + 4 = 5 > 0 ; sum_max = 6 , entonces la secuencia máxima es
 10 [ 4 , -1 , 2 , 1 ]; ¡
 11 termina!

De esta manera, cuando atravesamos la matriz, se encuentra la subsecuencia más grande, la complejidad de tiempo visible es O (n);

Alguien puede preguntar aquí: lo anterior solo atraviesa desde el elemento 4 de la posición 3 hasta el final. ¿Habrá un número que comience desde la posición 3 y vaya a una posición determinada mayor que la secuencia [4, -1,2,1] que comience desde el elemento 4?

Obviamente no, ¿por qué? Porque dijimos que mientras la secuencia actual y <0, descartemos todas las posiciones anteriores; y la secuencia y> 0, mantenemos esas posiciones. Por lo tanto, reservamos la posición a partir de 4. Muestra que la suma de la secuencia es mayor que 0; y comenzar a partir de 4 es obviamente un subconjunto de la secuencia a partir de 4, y la suma no puede ser mayor que comenzar a partir de 4.

Luego, hay una laguna obvia en las ideas anteriores: si la suma de la secuencia actual es negativa, comenzando desde la siguiente posición, ya no contiene todas las posiciones del período actual; obviamente, si todos los elementos de la matriz son negativos. Entonces no podemos encontrar una subsecuencia de suma máxima al final; pero sabemos que si una secuencia es completamente negativa, la subsecuencia máxima es el número negativo más grande entre ellos, por lo que debemos considerar el caso de todos los números negativos por separado.

Entonces, ¿cómo consideramos que una matriz es completamente negativa? En pocas palabras, si el elemento más grande de una matriz es negativo, entonces toda la matriz es negativa. Por lo tanto, podemos dar el código completo para encontrar la subsecuencia máxima:

 Solución de 1 clase {
 2  public :
 3      int maxSubArray (vector < int > & nums) {
 4          int max = 0 , temp = 0 ;
5          int allnegative_max = nums [ 0 ];
6      para ( int i = 0 ; i <nums.size (); i ++ ) {
 7          temp + = nums [i];
8          si (temp < 0 )
 9              temp = 0 ;
10          if (max <temp)
 11              max = temp;
 12          if (nums [i]> allnegative_max)
 13             allnegative_max = nums [i]; // Se usa para determinar si todos son negativos 
14      )
 15      if (allnegative_max < 0 ) // Indica que la matriz es totalmente negativa 
16        return allnegative_max;
 17      más 
18      return max;
 19      }
 20 };

Por supuesto, esta pregunta puede hacerse más: ¿encontrar la posición inicial de la subsecuencia de suma más grande? Entonces, ¿cómo codificar?

Solución de clase {
 public :
     int maxSubArray (vector < int > & nums) {
         int max = 0 , temp = 0 ;
        int start1, start2;
        int allnegative_max = nums [ 0 ];
    for ( int i = 0 ; i <nums.size (); i ++ ) { 
        temp + = nums [i];
        if (temp < 0 ) 
        { 
            temp = 0 ; 
            inicio1 = i +1 ; 
        } 
        if (max < temp) 
            max = temp;
         if (nums [i]> allnegative_max) 
        { 
           allnegative_max = nums [i]; // Se usa para juzgar si todos son números negativos 
           start2 = i; 
        } 
    } 
    if (allnegative_max < 0 ) // La matriz 
      contiene todos los números negativos return allnegative_max;
     else 
    return max; 
    } 
};

Donde start1 y start2 indican la ubicación

 

Supongo que te gusta

Origin www.cnblogs.com/shaonianpi/p/12736005.html
Recomendado
Clasificación