2023-07-15 Pregunta diaria de LeetCode (suma de cuatro números)

2023-7-15 una pregunta por día

1. Número de tema

18. 四数之和

2. Enlace temático

Haga clic para saltar a la ubicación del tema

3. Descripción del tema

Se le proporciona una matriz de números de n enteros y un objetivo de valor objetivo. Encuentre y devuelva cuádruples [nums[a], nums[b], nums[c], nums[d]] que cumplan con todas las siguientes condiciones y no se repitan (si dos elementos cuádruples corresponden uno a uno, los dos cuádruples se consideran repetidos):

  • 0 <= un, segundo, c, re < norte
  • a, b, c y d son diferentes entre sí
  • nums[a] + nums[b] + nums[c] + nums[d] == destino
    Puede devolver las respuestas en cualquier orden .

pista:

  • 1 <= nums.longitud <= 200
  • -10 9 <= números[i] <= 10 9
  • -10 9 <= objetivo <= 10 9

4. Código de resolución de problemas

class Solution {
    
    
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
    
    
        vector<vector<int>> res;
        int n = nums.size();
        if(n < 4){
    
    
            return res;
        }
        sort(nums.begin(), nums.end());
        for(int i = 0; i < n; ++i){
    
    
            while(i != 0 && i < n && nums[i] == nums[i-1]){
    
    
                ++i;
            }
            for(int j = i + 1; j < n; ++j){
    
    
                while(j != i + 1 && j < n && nums[j] == nums[j - 1]){
    
    
                    ++j;
                }
                int left = j + 1;
                int right = n - 1;
                while(left < right){
    
    
                    long long temp = (long long)nums[left] + nums[right] + nums[i] + nums[j];
                    if(temp < target){
    
    
                        ++left;
                    } else if(temp == target){
    
    
                        res.push_back({
    
    nums[i], nums[j], nums[left], nums[right]});
                        ++left;
                        --right;
                        while(left <= right && nums[left] == nums[left - 1]){
    
    
                            ++left;
                        }
                        while(left <= right && nums[right] == nums[right + 1]){
    
    
                            --right;
                        }
                    } else{
    
    
                        --right;
                    }
                }
            }
        }
    return res;
    }
};

Cinco, ideas para resolver problemas

(1) Este tema es una versión avanzada de la suma de tres números , que no es muy diferente de la suma de tres números. Si no sabe la suma de tres números, puede leer este artículo—— 2023-07 -08 LeetCode Daily 1 Pregunta (suma de tres números)

(2) Sigue siendo la misma forma de pensar, nuestro problema es encontrar cuatro números, y los que no se repiten son iguales al objetivo. Luego, primero ordenamos la matriz original, lo que es más propicio para que no se repita.

(3) Si usamos el método de juicio hash + bucle de cuatro capas, la complejidad del tiempo es muy alta y no debemos poder pasar la pregunta. Así que tenemos que elegir otro buen árbol para vivir. Configuramos el ciclo más externo para que atraviese el primer número. Para hacer que el primer número en el resultado sea diferente, entonces, si el número es el mismo que el número anterior, entonces se han descubierto todas las posibilidades para que el número sea el valor. no es necesario El primer número también tiene el mismo valor, i++.

(4) En este momento, hemos transformado el problema en un problema de la suma de tres números, pero la suma de los números que buscamos no es igual al objetivo, sino igual al objetivo - nums[i]. Debido a que la suma de tres números se ha escrito con gran detalle en este artículo, no entraré en detalles. Sin embargo, la idea general es la misma que la idea en (3), cómo evitar la repetición y luego reducir la complejidad del tiempo usando punteros dobles cuando solo quedan dos números.

Supongo que te gusta

Origin blog.csdn.net/qq_56086076/article/details/131734309
Recomendado
Clasificación