Tabla de contenido
1. Análisis del tema
Enlace del tema: 611. El número de triángulos válidos - Leetcode
Podemos entender este tema basándonos en el ejemplo 1,
Dijo que los números en la matriz pueden formar el número de tres lados de un triángulo,
Entonces primero enumeremos todas las situaciones nosotros mismos:
【2, 2, 3】
【2, 2, 4】
【2, 3, 4】
【2, 3, 4】
Hay cuatro casos en total,
Y el segundo caso no es cierto, mirando el ejemplo podemos saber que aunque todos son 2,
Pero diferentes posiciones pueden verse como elementos diferentes.
2. Principio del algoritmo
Al principio vimos un tema así, de hecho, la primera solución que nos vino a la mente fue una enumeración violenta,
Enumere todos los casos y luego juzgue, pero esta es una solución O (N3),
Podemos optimizar nuestra complejidad temporal mediante monotonicidad y punteros dobles,
Las ideas específicas son las siguientes:
1. Encuentra el valor máximo por clasificación.
2. Utilice punteros dobles para encontrar rápidamente el número que cumpla con los requisitos del tema.
La operación específica es la siguiente:
Tome esta matriz ordenada como ejemplo:
El puntero izquierdo apunta al elemento más pequeño, el puntero derecho apunta al elemento a la izquierda del elemento más grande,
Según la propiedad de que la suma de dos lados de un triángulo debe ser mayor que el tercer lado,
Si 2 + 9 > 10, se demuestra que 3 + 9, 4 + 9 y así sucesivamente serán mayores que 10,
De esta manera, podemos calcular directamente las situaciones adecuadas derecha-izquierda,
De esta forma, todos los números se pueden combinar con 9, vamos a la derecha--.
Si 2 + 5 <= 10, demuestra que ya sea 2 + 4 o 2 + 3, etc., será <= 10,
Entonces podemos dejar directamente left ++ para encontrar un número mayor.
Finalmente, cuando la izquierda y la derecha chocan, se pueden encontrar todas las situaciones adecuadas.
3. Escritura de código
class Solution {
public:
int triangleNumber(vector<int>& nums) {
int ans = 0;
sort(nums.begin(), nums.end());
for(int i = nums.size() - 1; i > 1; i--) {
int left = 0, right = i - 1;
while(left < right) {
if(nums[left] + nums[right] > nums[i]) {
ans += (right - left);
right--;
}
else left++;
}
}
return ans;
}
};
Escribe al final:
Lo anterior es el contenido de este artículo, gracias por leer.
Si sientes 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 ~