Código de Leet 18. cuatro y el número de

Dada una matriz n de enteros y un objetivo nums de destino, si hay cuatro elementos a, b, c, y la determinación d nums, un una adecuada + b + c + d es igual al valor del objetivo? Identificar todas satisfacer las condiciones del quad y no repita.

Y los tres-número de las mismas ideas. Los primeros dos números de dos ciclos, después de atravesar tanto a través de punteros. En el marco general del ciclo, después de un recorrido de código puntero bien, añadir una condición para aumentar la velocidad de desplazamiento, y una falta de énfasis.

  • Si menos de cuatro matriz de entrada, puede devolver una cadena vacía
  • Cuando i ciclo, puede determinar si el nums [i] y nums [i-1] son ​​iguales, son iguales, se pueden saltar porque esta situación atravesada
  • Cuando el ciclo i, el mínimo puede ser determinado si el número de cuatro y tiene más de destino, si es mayor que, menos probable que se describirá más adelante está satisfecho, dirigir el extremo del ciclo, el resultado devuelto
  • Del mismo modo, en el ciclo j, sino que también determina si hay los nums [j] y nums [j-1] es igual al caso en el
  • Adecuado atravesar el puntero, pero también igual al número de cada se determina bajo estrecha si el puntero R y L

Enviar código

import java.util.*;
import static java.lang.Math.min;

public class leetcode {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        String str = scan.nextLine();
        int[] nums = new int[n];
        for(int i = 0; i < n; i++) {
            nums[i] = scan.nextInt();
        }
        int target = scan.nextInt();
        List result = fourSum(nums, target);
        System.out.println(result);
    }

    public static List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> ans = new ArrayList<>();
        int len = nums.length;
        if(nums == null || len < 4) return ans;
        Arrays.sort(nums);
        for(int i = 0; i<len-3 ; i++) {
            if( i>0 && nums[i] == nums[i-1]) continue;
            if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3] > target) break;
            for(int j = i+1; j<len-2; j++) {
                if( j>i+1 && nums[j] == nums[j-1]) continue;
                int L = j + 1;
                int R = len - 1;
                while(L < R) {
                    int sum = nums[i] + nums[j] + nums[L] + nums[R];
                    if(sum == target) {
                        ans.add(Arrays.asList(nums[i],nums[j],nums[L],nums[R]));
                        while (L < R && nums[L] == nums[L+1]) L++;
                        while (L < R && nums[R] == nums[R-1]) R--;
                        L++;
                        R--;
                    }
                    else if (sum - target < 0) L++;
                    else if (sum - target > 0) R--;
                }
            }
        }
        return ans;
    }
}

Supongo que te gusta

Origin www.cnblogs.com/chenshaowei/p/12641326.html
Recomendado
Clasificación