611. Número de triángulos válidos
611. El número de triángulos válidos https://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
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};
}
};