[Diario de superación del algoritmo] día 03: algoritmo de doble puntero: el número de triángulos efectivos y los dos números cuya suma es s

  

611. Número de triángulos válidos

611. El número de triángulos válidos icono-default.png?t=N6B9https://leetcode.cn/problems/valid-triangle-number/

Descripción del Título:

Dada una matriz de números enteros no negativos  nums , devuelve el número de triples que pueden formar los lados de un triángulo.

Ideas para resolver problemas:

Esta pregunta es una pregunta sobre si se puede establecer un triángulo. Primero, asumimos que los tres lados del triángulo (a, b, c), debemos asegurarnos de que la suma de los dos lados sea mayor que el tercer lado.

 

 El título nos dice que los números están desordenados. Si experimentamos con abc uno por uno, se agotará el tiempo de espera (complejidad de tiempo O^3)

Cuando ordenamos, suponiendo que a<b<c, ¡solo necesitamos juzgar si a+b>c es verdadero!

Aquí atravesamos cada c (de atrás hacia adelante), de modo que la complejidad del tiempo se convierte en N^2+NlogN, que es N^2

Código de resolución de problemas:

class Solution {
public:
    int triangleNumber(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        //假设a<b<c
        int num=0;
        int n=nums.size();
        for(int i=n-1;i>=2;i--)
        {
            int left=0;
            int right=i-1;
            while(left<right)
            {
                if(nums[left]+nums[right]>nums[i])
                {
                    num+=(right-left);
                    right--;
                }
                else
                {
                    left++;
                }
            }
        }
        return num;
    }
};

  Espada se refiere a la Oferta 57. Dos números cuya suma es s

Sword se refiere a la Oferta 57. Dos números cuya suma es s icono-default.png?t=N6B9https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/

Descripción del Título:

Ingrese una matriz ordenada en orden ascendente y un número s, encuentre dos números en la matriz de modo que su suma sea exactamente s. Si la suma de varios pares de números es igual a s, simplemente genere cualquier par.

Ideas para resolver problemas: 

En primer lugar, esta pregunta es una matriz ascendente. Si usamos violencia aquí, el tiempo de espera expirará.

Aquí usamos punteros dobles, dejamos que uno apunte a la cabeza izquierda y otro a la cola derecha, aquí habrá tres relaciones entre izquierda, derecha y objetivo.

Suponemos sub=derecha-izquierda

 En el primer caso, es obvio regresar directamente, estudiemos el segundo y tercer caso:

Código de resolución de problemas:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n=nums.size();
        int left=0;
        int right=n-1;
        while(nums[right]>target)
        {
            right--;
        }
        while(left<right)
        {
            int sub=target-nums[right];
            if(sub==nums[left])
            {
                return {nums[left],nums[right]};
            }
            else if(sub>nums[left])
            {
                left++;
            }
            else//sub<nums[left]
            {
                right--;
            }
        }
        return {-1,-1};
    }
};

 

 

Supongo que te gusta

Origin blog.csdn.net/m0_69061857/article/details/132380120
Recomendado
Clasificación