Problema: Espada se refiere a la Oferta 57. Dos números cuya suma es s
Directorio de artículos
análisis de tema
Primero, expliquemos la idea de este tema.
- Vemos que el significado de esta pregunta es muy simple, es
nums
buscar en esta matriz, si se encuentra la suma de los dos númerostarget
, se forma un conjunto de resultados y se devuelve
Análisis del pensamiento algorítmico.
A continuación, analicemos la idea de esta pregunta.
- Solución de fuerza bruta
- En primer lugar, lo primero que todos pensamos es en [solución violenta], es decir, usar dos capas de bucles for para hacer el trabajo de coincidencia uno por uno, pero podemos imaginar que este tipo de solución definitivamente expirará. , así que no lo haré aquí mucha narrativa.
for(int i = 0;i < nums.size(); ++i)
for(int j = i + 1;j < nums.size(); ++j)
- Aproveche la monotonicidad y utilice el algoritmo de doble puntero para resolver
- En nuestro caso, utilizamos principalmente la solución de punteros dobles para resolver este problema. Un
left
puntero apunta al extremo izquierdo y el otroright
apunta al extremo derecho. A través del recorrido de ida y vuelta, podemos encontrar qué dos números pueden formar el resultado. [objetivo]
- Habrá tres situaciones aquí, la primera es la primera, si la encontramos
nums[left] + nums[right] < target
, entonces podemos hacer un trabajo complicado en este momento. - Los lectores pueden volver a leer atentamente el significado de esta pregunta y luego podrán saber que la secuencia de la matriz está en orden creciente, entonces, dado que [2] y el más grande [21] son más pequeños que el anterior a [21], se obtendrán algunos números
target
. incluso más pequeño, y no necesitamos hacer múltiples comparaciones de una sola vez. En este punto simplemente ejecuteleft++
- A continuación, consideremos esta
nums[left] + nums[right] > target
situación nuevamente, entonces sabemos que esta situación también es inconsistente, pero podemos hacer más simplificaciones al emitir juicios. - Los lectores pueden pensar en ello primero: ¿qué número deberíamos excluir en este momento? Eso obviamente es esto [21], ¿por qué? Piensa en esto [21] y se superará el [11] más pequeño
target
, ¿luego se superará aún más el resto de [15] y [19]? - Entonces este [21] deberíamos descartarlo, y el código correspondiente es
right--
- Si se encuentra el último, solo necesitamos devolver el conjunto de resultados de estos dos datos.
la complejidad
- complejidad del tiempo:
Considerando el peor de los casos, es decir, cuando recorremos la búsqueda, los dos punteros izquierdo y derecho se encuentran, es decir, no se encuentran, es decir, recorremos la secuencia una vez, y su complejidad temporal es O ( n ) O (n )O ( n )
- Complejidad espacial:
No se asigna espacio adicional, por lo que la complejidad del espacio es O ( 1 ) O(1)o ( 1 )
Código
La siguiente es la visualización del código.
- Hablemos de esto y esto
{nums[left], nums[right]}
. Es posible que algunos amigos no lo tengan muy claro. Esto pertenece a la lista de conocimientos relevantes de inicialización de C ++. - Generalmente, cuando devolvemos una colección de dos números en LeetCode, no necesitamos crear una nueva colección de vectores, sino que formaremos una colección de vectores mediante una conversión de tipo implícita para devolver
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
int sum = 0;
while(left < right)
{
sum = 0;
sum = nums[left] + nums[right];
if(sum < target){
left++;
}else if(sum > target){
right--;
}else{
return {
nums[left], nums[right]};
}
}
return {
-1, -1};
}
};