给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

    注意:

    答案中不可以包含重复的四元组。

    示例:

    给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。

    满足要求的四元组集合为:

    [

    [-1, 0, 0, 1],

    [-2, -1, 1, 2],

    [-2, 0, 0, 2]

    ]

    1. import java.util.*;
    2. public class FourSum {
    3. public List<List<Integer>> fourSum(int[] nums, int target) {
    4. Arrays.sort(nums);
    5. Map<Integer, List<List<Integer>>> map = new HashMap<>();
    6. Set<List<Integer>> set = new TreeSet<>((o1, o2) -> {
    7. for (int k = 0; k < o1.size(); k++) {
    8. if (!o1.get(k).equals(o2.get(k))) {
    9. return o1.get(k) - o2.get(k);
    10. }
    11. }
    12. return 0;
    13. });
    14. for (int i = 0; i < nums.length; i++) {
    15. for (int j = i + 1; j < nums.length; j++) {
    16. int value = nums[i] + nums[j];
    17. if (map.containsKey(target - value)) {
    18. for (List<Integer> list : map.get(target - value)) {
    19. if (list.get(1) < i) {
    20. List<Integer> temp = new ArrayList<>();
    21. temp.add(nums[list.get(0)]);
    22. temp.add(nums[list.get(1)]);
    23. temp.add(nums[i]);
    24. temp.add(nums[j]);
    25. set.add(temp);
    26. }
    27. }
    28. }
    29. List<List<Integer>> lists = map.get(value);
    30. if (lists == null) {
    31. lists = new ArrayList<>();
    32. }
    33. List<Integer> list = new ArrayList<>();
    34. list.add(i);
    35. list.add(j);
    36. lists.add(list);
    37. map.put(value, lists);
    38. }
    39. }
    40. return new ArrayList<>(set);
    41. }
    42. }