15 Suma de tres números (clasificación + tres punteros)

1. Descripción del problema:

Le da una matriz de n números enteros, determine si hay tres elementos a, b, c en números, de modo que a + b + c = 0 Encuentre todos los triples que cumplan la condición y no repita.

Nota: La respuesta no puede contener triples duplicados.

Ejemplos:

Números de matriz dados = [-1, 0, 1, 2, -1, -4],

El conjunto de triples que cumplen los requisitos es:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

Fuente:
Enlace (LeetCode) : https://leetcode-cn.com/problems/3sum

2. Análisis de pensamiento:

① El tema aún es fácil de entender. Antes, hice una suma de cuatro dígitos de la hebilla del collar . El método de usar cuatro punteros es similar a los cuatro punteros anteriores, por lo que puede usar tres Use punteros para hacerlo. Si usa otros métodos para hacerlo, es más problemático y es fácil agotar el tiempo de espera. Por ejemplo, si los datos recursivos son pequeños, se pueden resolver. Si como los últimos uno o dos mil datos en el collar, no puede llevarse. Se agotará el tiempo de espera y es problemático recurrentemente si hay muchos datos duplicados.

② En primer lugar, debe ordenar la matriz para poder extraer los elementos y juzgar si se repiten más tarde. Al principio, el primer puntero apunta a la posición del primer elemento y el segundo apunta al segundo elemento. La posición del siguiente elemento, el tercer puntero apunta a la posición del último elemento, y luego estas posiciones se moverán hacia abajo en el bucle. Cabe señalar que el problema requiere números únicos. Por lo tanto, es necesario determinar la deduplicación primero durante el reciclaje, porque cuando los elementos son iguales, qué elemento se extrae y se agrega es el mismo.

③ Si los elementos agregados actuales en a, byc son menores que 0, entonces el puntero b se mueve un bit hacia la derecha, y si es mayor que 0, c se mueve un bit hacia la izquierda. Cuando se mueve, debe asegurarse de que b sea menor que c. La posición del número es correcta. Cuando el resultado de la suma es igual a 0, entonces necesita ir al siguiente elemento que se repite con los elementos byc (para asegurarse de que el siguiente elemento sacado de las posiciones byc no se repita) Desplazamiento a la derecha, desplazamiento a la izquierda

④ Entonces, al principio, el elemento en la posición a necesita ser deduplicado, pero al principio, la posición b no necesita ser deduplicada, porque la posición b será deduplicada cuando el elemento agregado sea igual a 0, entonces al principio, el peso en la posición b Cuando el elemento es igual a 0, causará juicios repetidos y se agotará el tiempo de espera. También fui al elemento b al principio, pero descubrí que los últimos dos datos de prueba en el envío expiraron. b posición peso

3. El código es el siguiente:

class Solution {
   public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        Arrays.sort(nums);
        int len = nums.length;
        for (int a = 0; a <= len - 3; ++a){
            //优化
            if (nums[a] > 0) return res;
            //去重
            if (a > 0 && nums[a] == nums[a - 1]) continue;
            int b = a + 1, c = len - 1;
            while (b < c){
                int target = nums[a] + nums[b] + nums[c];
                if (target < 0) ++b;
                else if (target > 0) --c;
                else {
                    List<Integer> newEle = new ArrayList<>();
                    newEle.add(nums[a]);
                    newEle.add(nums[b]);
                    newEle.add(nums[c]);
                    res.add(newEle);
                    //去重
                    while (b < c && nums[b] == nums[b + 1]) ++b;
                    //去重
                    while (b < c && nums[c] == nums[c - 1]) --c;
                    ++b;
                    --c;
                }
            }
        }
        return res;
    }
}

 

 

569 artículos originales publicados · Me gusta 153 · Visitas 590,000+

Supongo que te gusta

Origin blog.csdn.net/qq_39445165/article/details/105375258
Recomendado
Clasificación