Tabla de contenido
1. Análisis de preguntas
Enlace de pregunta: 1004. Número máximo de unos consecutivos III - Leetcode
Esta pregunta no es difícil de entender, de hecho, es encontrar el subarreglo continuo más largo de 1.
Sin embargo, admite una operación que consiste en convertir k 0 en 1.
Una vez que esta condición salió a la luz, la dificultad de esta pregunta aumentó y la situación se volvió más complicada.
2. Principio del algoritmo
Entonces podemos pensar en cómo abstraer una regla:
Transforme este problema en: encuentre el subarreglo más largo con no más de k 0,
Si utiliza una enumeración violenta, la idea es relativamente simple.
Según la enumeración de fuerza bruta, podemos usar ventanas deslizantes para optimizar este problema.
De hecho, el paso más difícil: ya hemos terminado el problema de conversión, solo nos falta diseñar la ventana corrediza en base a esta idea.
Mantenemos una ventana,
Cuando el número de ceros es menor que 2, la ventana se expande continuamente,
Cuando el número de ceros es igual a 2, registramos el subarreglo más largo,
Cuando el número de ceros es mayor que 2, reducimos la ventana hasta que el número de ceros sea menor o igual a 2
Veamos el código:
3. Escritura de código
class Solution {
public:
int longestOnes(vector<int>& nums, int k) {
unordered_map<int, int> win;
int len = 0, left = 0, right = 0;
while(right < nums.size()) {
len = max(len, right - left);
win[nums[right++]]++;
while(left < nums.size() && win[0] > k) {
win[nums[left++]]--;
}
}
len = max(len, right - left);
return len;
}
};
Escribe al final:
Ese es el contenido de este artículo, gracias por leer.
Si crees que has ganado algo, puedes darle un me gusta al blogger .
Si hay omisiones o errores en el contenido del artículo, envíe un mensaje privado al blogger o indíquelo en el área de comentarios ~