【Avance del algoritmo】 Puntero doble: el número de triángulos válidos (5)

Tabla de contenido

1. Análisis del tema

2. Principio del algoritmo

3. Escritura de código

Escribe al final:


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 ~

Supongo que te gusta

Origin blog.csdn.net/Locky136/article/details/131590581
Recomendado
Clasificación