【LeetCode】 Dos consejos para resolver dos números cuya suma es s

inserte la descripción de la imagen aquí

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

análisis de tema

Primero, expliquemos la idea de este tema.

  • Vemos que el significado de esta pregunta es muy simple, es numsbuscar en esta matriz, si se encuentra la suma de los dos números target, se forma un conjunto de resultados y se devuelve

1.jpg

Análisis del pensamiento algorítmico.

A continuación, analicemos la idea de esta pregunta.

  1. 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)

2.jpg

  1. 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 leftpuntero apunta al extremo izquierdo y el otro rightapunta al extremo derecho. A través del recorrido de ida y vuelta, podemos encontrar qué dos números pueden formar el resultado. [objetivo]

3.jpg

  • 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++

4.jpg

  • A continuación, consideremos esta nums[left] + nums[right] > targetsituació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 esright--

5.jpg

  • Si se encuentra el último, solo necesitamos devolver el conjunto de resultados de estos dos datos.

6.jpg

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};
    }
};

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Fire_Cloud_1/article/details/132699366
Recomendado
Clasificación