【Pregunta diaria de LeetCode】—— 454. Suma de cuatro números II

Una [categoría de tema]

  • tabla de picadillo

Dos [dificultad de la pregunta]

  • medio

Tres [número de tema]

  • 454. Suma de cuatro números II

Cuatro [descripción del título]

  • Dadas las cuatro matrices de enteros nums1, nums2, nums3 y nums4, la longitud de las matrices es n, calcule cuántas tuplas (i, j, k, l) pueden satisfacer:
    • 0 <= yo, j, k, l < norte
    • numero1[i] + numero2[j] + numero3[k] + numero4[l] == 0

Cinco [ejemplos de temas]

  • Ejemplo 1:

    • Entrada: num1 = [1,2], num2 = [-2,-1], num3 = [-1,2], num4 = [0,2]
    • Salida: 2
    • explicar:
      • Las dos tuplas son las siguientes:
        1. (0, 0, 0, 1) -> numero1[0] + numero2[0] + numero3[0] + numero4[1] = 1 + (-2) + (-1) + 2 = 0
        2. (1, 1, 0, 0) -> numero1[1] + numero2[1] + numero3[0] + numero4[0] = 2 + (-1) + (-1) + 0 = 0
  • Ejemplo 2:

    • Entrada: num1 = [0], num2 = [0], num3 = [0], num4 = [0]
    • Salida: 1

Seis [mensaje de tema]

  • n = = nums 1. longitudn == nums1.longitudnorte==números 1. longitud _ _ _ _ _ _ _ _
  • n = = nums 2. longitudn == nums2.longitudnorte==números 2. longitud _ _ _ _ _ _ _ _
  • n = = nums 3. longitudn == nums3.longitudnorte==números 3. longitud _ _ _ _ _ _ _ _
  • n = = nums 4. longitudn == nums4.longitudnorte==números 4. longitud _ _ _ _ _ _ _ _
  • 1 < = norte < = 200 1 <= norte <= 2001<=norte<=200
  • − 2 28 < = números 1 [ yo ] , números 2 [ yo ] , números 3 [ yo ] , números 4 [ yo ] < = 2 28 -2^{28} <= números1[i], números2[i], números3[i], números4[i] <= 2^{28}228<=números 1 [ yo ] , _ _ _números 2 [ yo ] , _ _ _números 3 [ i ] , _ _ _números 4 [ i ] _ _ _<=228

Siete [ideas para resolver problemas]

  • Divide las cuatro matrices en dos grupos.
  • Primero recorra las posibles combinaciones de todos los valores de los elementos de las dos matrices en el primer grupo, calcule su suma y use la suma como la clave de la tabla hash, y el valor de la tabla hash es el número de combinaciones de elementos con la misma suma
  • Luego recorre las posibles combinaciones de todos los valores de los elementos de las dos matrices del segundo grupo, pero calculamos el valor opuesto (solo agregue un signo negativo), si el valor puede coincidir en la tabla hash, significa que la suma es 0, entonces acumular el número de ocurrencias puede ser
  • Finalmente devuelve el resultado.

Ocho 【Frecuencia de tiempo】

  • Complejidad del tiempo: O ( n 2 ) O(n^2)O ( n2 ),nnn es la longitud de la matriz entrante
  • Complejidad del espacio: O ( n 2 ) O(n^2)O ( n2 ),nnn es la longitud de la matriz entrante

Nueve [implementación de código]

  1. Versión del lenguaje Java
class Solution {
    
    
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    
    
        int n = nums1.length;
        int count = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0;i < n;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                int sum = nums1[i] + nums2[j];
                if(map.containsKey(sum)){
    
    
                    map.put(sum, map.get(sum)+ 1);
                }else{
    
    
                    map.put(sum, 1);
                }
            }
        }
        for(int i = 0;i < n;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                int oppoSum = -(nums3[i] + nums4[j]);
                if(map.containsKey(oppoSum)){
    
    
                    count += map.get(oppoSum);
                }
            }
        }
        return count;
    }
}
  1. Versión en lenguaje C
struct hashTable
{
    
    
    int key;
    int val;
    UT_hash_handle hh;
};

int fourSumCount(int* nums1, int nums1Size, int* nums2, int nums2Size, int* nums3, int nums3Size, int* nums4, int nums4Size)
{
    
    
    struct hashTable* map = NULL;
    int count = 0;
    for(int i = 0;i < nums1Size;i++)
    {
    
    
        for(int j = 0;j < nums1Size;j++)
        {
    
    
            int sum = nums1[i] + nums2[j];
            struct hashTable* temp;
            HASH_FIND_INT(map, &sum, temp);
            if(temp == NULL)
            {
    
    
                struct hashTable* insertVal = malloc(sizeof(struct hashTable));
                insertVal->key = sum;
                insertVal->val = 1;
                HASH_ADD_INT(map, key, insertVal);
            }
            else
            {
    
    
                temp->val++;
            }
        }
    }
    for(int i = 0;i < nums1Size;i++)
    {
    
    
        for(int j = 0;j < nums1Size;j++)
        {
    
    
            int oppo_sum = -(nums3[i] + nums4[j]);
            struct hashTable* temp;
            HASH_FIND_INT(map, &oppo_sum, temp);
            if(temp != NULL)
            {
    
    
                count += temp->val;
            }
        }
    }
    return count;
}
  1. Versión en lenguaje Python
class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        n = len(nums1)
        count = 0
        map = {
    
    }
        for a in nums1:
            for b in nums2:
                sum = a + b
                if sum in map:
                    map[sum] = map[sum] + 1
                else:
                    map[sum] = 1
        for c in nums3:
            for d in nums4:
                oppo_sum = -(c + d)
                if oppo_sum in map:
                    count += map[oppo_sum]
        return count
  1. Versión del lenguaje C++
class Solution {
    
    
public:
    int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    
    
        int n = nums1.size();
        int count = 0;
        unordered_map<int, int>  map;
        for(int i = 0;i < n;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                int sum = nums1[i] + nums2[j];
                if(map.count(sum) != 0){
    
    
                    map[sum]++;
                }else{
    
    
                    map[sum] = 1;
                }
            }
        }
        for(int i = 0;i < n;i++){
    
    
            for(int j = 0;j < n;j++){
    
    
                int oppoSum = -(nums3[i] + nums4[j]);
                if(map.count(oppoSum) != 0){
    
    
                    count += map[oppoSum];
                }
            }
        }
        return count;
    }
};

Diez 【Resultados de envío】

  1. Versión del lenguaje Java
    inserte la descripción de la imagen aquí

  2. Versión en lenguaje C
    inserte la descripción de la imagen aquí

  3. Versión en lenguaje Python
    inserte la descripción de la imagen aquí

  4. Versión del lenguaje C++
    inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/IronmanJay/article/details/132258850
Recomendado
Clasificación