[Li Buckle] 15. Soma de três números<Mãos duplas>

[Likou] 15. Soma de três números

Dado um array inteiro nums, determine se existe um triplo [nums[i], nums[j], nums[k]]que o satisfaça i != j、i != k 且 j != ke também o satisfaça nums[i] + nums[j] + nums[k] == 0. Por favor, retorne todos os triplos não duplicados cuja soma seja 0. Nota: As respostas não podem conter triplos duplicados.

Exemplo 1:
Entrada: nums = [-1,0,1,2,-1,-4]
Saída: [[-1,-1,2],[-1,0,1]]
Explicação:
nums[0 ] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 .
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 .
Os diferentes triplos são [-1,0,1] e [-1,-1,2].
Observe que a ordem da saída e a ordem dos triplos não importam.

Exemplo 2:
Entrada: nums = [0,1,1]
Saída: []
Explicação: A única soma possível de triplos não é 0.

Exemplo 3:
Entrada: nums = [0,0,0]
Saída: [[0,0,0]]
Explicação: A única soma possível de triplos é 0.

Exemplo:
3 <= nums.length <= 3000
- 1 0 5 10^51 05 <= números[i] <=1 0 5 10^51 05

responder

Primeiro classifique o array, corrija o primeiro, use os ponteiros duplos para apontar para o próximo e o último e julgue um por um.
Use Set para remover duplicatas

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);
    }
}

おすすめ

転載: blog.csdn.net/qq_44033208/article/details/132677555