[Clásico de la entrevista] Ondas irregulares: la respuesta estándar al problema de la matriz de swing

Introducir definición

Si la diferencia entre números consecutivos alterna estrictamente entre números positivos y negativos, se denomina matriz de swing.

Dé algunos ejemplos. [1,7,4,9,2,5]Es una matriz de swing típica, es como una onda con baches; no [1,7,4,5,5]es una matriz de swing, porque no es estrictamente hacia arriba y hacia abajo; [1]y [1,5]todos cumplen con la definición, es una matriz de swing.

 
 

Dos temas

Q1. Devuelve la longitud de la matriz de oscilación continua más grande contenida en la matriz.
 
Entrada: [9,4,2,10,7,8,8,1,9]
Salida: 5
Explicación: [4,2,10,7,8] la longitud es 2

Q2. Devuelve la longitud de la matriz de oscilación más grande contenida en la matriz, que no es necesario que sea continua.
 
Entrada: [1,17,5,10,13,15,10,5,16,8]
Salida: 7
Explicación: [1,17,10,13,10,16,8] es 7

 
 

Dos respuestas

  1. La respuesta a la matriz de swing es más basada en una plantilla: use dos variables para registrar la longitud de la matriz de swing en este momento ( arriba, abajo )
  2. El significado de arriba es que cuando se atraviesa hasta ese punto, se asume que la matriz oscilante está en un estado ascendente, y su longitud; el significado de abajo es que al atravesar ese punto, se asume que la matriz oscilante está en un estado descendente, y su longitud
  3. Debe entenderse que estos dos arreglos oscilantes no son iguales, porque asumimos que sus extremos están en un estado ascendente / descendente respectivamente.
  4. La clave también es la conversión de estos dos estados, es decir, la conversión cruzada de arriba y abajo (problemas de stock de contacto)
  5. Debido a que Q1 requiere continuidad, cuando la matriz de oscilación se rompe, el arriba / abajo debe restablecerse a 1; mientras que Q2 no requiere continuo, es decir, la matriz de oscilación está oculta en toda la matriz y la arriba / abajo no necesita para restablecer, pero solo debe heredarse (diferencia clave)
class Solution {
    
    
    public int maxTurbulenceSize(int[] arr) {
    
    
        int up = 1;
        int down = 1;
        int res = 1;
        
        for(int i = 1; i < arr.length; i++) {
    
    
            if(arr[i] > arr[i - 1]) {
    
    
                up = down + 1;
                down = 1;
            } else if(arr[i] < arr[i - 1]) {
    
    
                down = up + 1;
                up = 1;
            } else {
    
    
                up = 1;
                down = 1;
            }
            res = Math.max(res, Math.max(up, down));
        }
        return res;
    }
}
class Solution {
    
    
    public int maxTurbulenceSize(int[] arr) {
    
    
        int up = 1;
        int down = 1;

        for(int i = 1; i < arr.length; i++) {
    
    
            if(arr[i] > arr[i - 1]) {
    
    
                up = down + 1;
            }
            if(arr[i] < arr[i - 1]) {
    
    
                down = up + 1;
            }
        }
        return Math.max(up, down);
    }
}

 
 

Piensa y explora

Espere un minuto, la conversión cruzada de este estado nos recuerda el clásico problema de stock ( pinche aquí ), por lo que la llamada plantilla arriba / abajo, ¿es el resultado de la programación dinámica optimizada por arreglo rodante ?

Sí lo es.
 
A continuación restauraremos el proceso evolutivo completo de esta pregunta desde la perspectiva de la programación dinámica.

dp[i][0]El significado de es la longitud máxima de la matriz de oscilación que termina en i y termina en un estado ascendente

dp[i][1]El significado de es la longitud máxima de la matriz de oscilación que termina en i y cae al final

// 状态转移
if(arr[i] > arr[i - 1]) {
    
    
	dp[i][0] = dp[i][1] + 1;
}
if(arr[i] < arr[i - 1]) {
    
    
	dp[i][1] = dp[i][0] + 1;
}

// 滚动优化
if(arr[i] > arr[i - 1]) {
    
    
	dp[0] = dp[1] + 1;
}
if(arr[i] < arr[i - 1]) {
    
    
	dp[1] = dp[0] + 1;
}

 
 

Un poco de comprensión

  En la programación dinámica, definir el significado de dp [i] [0/1] es el punto clave y difícil. Recuerde una cosa, el significado de dp [i] es "el valor correspondiente al estado (0/1) después de que se completa el cambio de i en este momento / aquí", la clave es " estado ";

  En la emisión de acciones, el significado de dp [i] [0/1] tiende a indicar (tenencia / no tenencia) en lugar de acción (compra / venta); en la matriz de swing, dp [i] [0 / El significado de 1] también se inclina por el estado (el estado de subida y bajada) en lugar de la acción (la acción de subir y bajar); es muy importante comprender la palabra estado.

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

FIN FIN E N D

Supongo que te gusta

Origin blog.csdn.net/m0_46202073/article/details/113763799
Recomendado
Clasificación