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
- 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 )
- 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
- Debe entenderse que estos dos arreglos oscilantes no son iguales, porque asumimos que sus extremos están en un estado ascendente / descendente respectivamente.
- 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)
- 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