Leetcode doble puntero suma de tres números / suma más cercana de tres números java

Descripción del título
Déle una matriz nums que contenga n enteros y juzgue si hay tres elementos a, b, c en nums tales que a + b + c = 0? Encuentre todos los triples que cumplan las condiciones y no se repitan.
Nota: La respuesta no puede contener triples repetidos.

Ejemplo:
Dada la matriz nums = [-1, 0, 1, 2, -1, -4], el
conjunto de triples que cumple los requisitos es:
[
[-1, 0, 1],
[-1, -1 , 2]
]

Idea:
Primero ordene la matriz,
cree una lista para almacenar
un número num [i] en la matriz fija de resultados y luego use un puntero doble para señalar los extremos izquierdo y derecho del número (nums [izquierda], nums [derecha ]), y calcule el número Y la suma de los números apuntados por los dos punteros.Si es 0, se suma al conjunto de resultados.
Si num [i] es mayor que 0, los siguientes números son mayores que 0, y la suma de los tres números no debe ser 0, y el ciclo termina;
si num [i] == num [i-1], el el número se repite y se omite;
si la suma es 0, agregue al conjunto de resultados, si nums [izquierda] = nums [izquierda + 1], el resultado se repetirá, izquierda ++; si nums [derecha] = nums [derecha-1] , el resultado se repetirá, correcto–;
código:

class Solution {
    
    
    public List<List<Integer>> threeSum(int[] nums) {
    
    
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for(int i = 0;i<nums.length-2;i++){
    
    
            int left = i+1;
            int right = nums.length - 1;
            if(nums[i] >0){
    
    
                return res;
            }
            if(i > 0 && nums[i] == nums[i-1]){
    
    
                continue;
            }
            while(left < right){
    
    
                int sum = nums[i]+nums[left]+nums[right];
                if(sum == 0){
    
    
                    res.add(Arrays.asList(new Integer[]{
    
    nums[i],nums[left],nums[right]}));
                    while(left <right && nums[left] == nums[left+1]){
    
    
                        left++;
                    }
                    while(left <right && nums[right] == nums[right-1]){
    
    
                        right--;
                    }
                    left++;
                    right--;
                }else if (sum < 0){
    
    
                    left++;
                }else{
    
    
                    right--;
                }
            }
            
        }
        return res;
    }
}

La suma más cercana de tres números
descripción del problema
Dada una matriz de números que incluye n números enteros y un objetivo de valor objetivo. Encuentre los tres enteros en números para que su suma sea la más cercana al objetivo. Devuelve la suma de estos tres números. Suponga que solo hay una respuesta para cada conjunto de entradas.
Entrada: nums = [-1,2,1, -4], objetivo = 1
Salida: 2
Explicación: La suma más cercana al objetivo es 2 (-1 + 2 + 1 = 2).

La idea es básicamente la misma que la pregunta anterior.
Necesita agregar una variable diff para registrar la diferencia entre la suma de tres números y el objetivo, y la variable closeSum registra la suma más cercana de tres números.
No es necesario juzgar la relación de tamaño entre nums [izquierda] y nums [izquierda + 1], nums [derecha] y nums [derecha-1] (la pregunta anterior no es repetible)
si la suma actual de tres números es mayor que la diferencia del objetivo Si la diferencia es pequeña, actualice el valor de la diferencia y también actualice el valor de closeSum.
Si la suma actual de tres números es menor que el objetivo, entonces dejó ++, lo que hace que la suma sea mayor.
Si la suma actual de tres números es mayor que el objetivo, luego a la derecha–, lo que hace que la suma sea más pequeña

Código:

class Solution {
    
    
    public int threeSumClosest(int[] nums, int target) {
    
    
        Arrays.sort(nums);
        int diff = Integer.MAX_VALUE;
        int closeSum = 0;
        for(int i = 0;i<nums.length-2;i++){
    
    
            int left = i+1;
            int right = nums.length-1;
            int sum = 0;
            int tempdiff = 0;
            while(left < right){
    
    
                sum = nums[i] + nums[left] + nums[right];
                tempdiff = Math.abs(sum-target);
                if(tempdiff < diff){
    
    
                    closeSum = sum;
                    diff = tempdiff;
                }
                if(sum < target){
    
    
                    left++;
                }else if (sum > target){
    
    
                    right--;
                }else{
    
    
                    return closeSum;
                }

            }
            
        }
        return closeSum;

    }
}

Supongo que te gusta

Origin blog.csdn.net/stonney/article/details/111335835
Recomendado
Clasificación