[Likou] 15. Suma de tres números
Dada una matriz de números enteros, determine si hay un triple [nums[i], nums[j], nums[k]]
que la satisfaga i != j、i != k 且 j != k
y también la satisfaga nums[i] + nums[j] + nums[k] == 0
. Devuelva todos los triples no duplicados cuya suma sea 0. Nota: Las respuestas no pueden contener triples duplicados.
Ejemplo 1:
Entrada: nums = [-1,0,1,2,-1,-4]
Salida: [[-1,-1,2],[-1,0,1]]
Explicación:
nums[0 ] + números[1] + números[2] = (-1) + 0 + 1 = 0.
números[1] + números[2] + números[4] = 0 + 1 + (-1) = 0 .
números[0] + números[3] + números[4] = (-1) + 2 + (-1) = 0 .
Los diferentes triples son [-1,0,1] y [-1,-1,2].
Tenga en cuenta que el orden de la salida y el orden de los triples no importan.
Ejemplo 2:
Entrada: nums = [0,1,1]
Salida: []
Explicación: La única suma posible de triples no es 0.
Ejemplo 3:
Entrada: nums = [0,0,0]
Salida: [[0,0,0]]
Explicación: La única suma posible de triples es 0.
Siguiente:
3 <= nums.length <= 3000
- 1 0 5 10^51 05 <= números[i] <=1 0 5 10^51 05
respuesta
Primero ordene la matriz, arregle la primera, use punteros dobles para señalar la siguiente y la última, y juzgue una por una.
Utilice Set para eliminar duplicados
import java.util.*;
public class Main {
public static void main(String[] args) {
int[] nums = {
-1,0,1,2,-1,-4};
Arrays.sort(nums);
Set<List<Integer>> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (nums[i] > 0) {
break;
}
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (sum > 0) {
right--;
}
else if (sum < 0) {
left++;
}
else {
set.add(Arrays.asList(nums[i], nums[left], nums[right]));
right--;
left++;
}
}
}
List<List<Integer>> resultList = new ArrayList<>(set);
System.out.println(resultList);
}
}