1. public List<List<Integer>> threeSum(int[] nums) {
    2. // result
    3. HashSet<List<Integer>> result = new HashSet<>();
    4. // bound
    5. if (nums.length < 3) {
    6. return new ArrayList<>();
    7. }
    8. // sort
    9. Arrays.sort(nums);
    10. // out loop
    11. for (int i = 0; i < nums.length - 2; i++) {
    12. // tow pointer close
    13. int j = i + 1;
    14. int k = nums.length - 1;
    15. while (j < k) {
    16. int sum = nums[i] + nums[j] + nums[k];
    17. if (sum == 0) {
    18. result.add(Arrays.asList(nums[i], nums[j++], nums[k--]));
    19. }else if (sum < 0) {
    20. j++;
    21. }else if (sum > 0) {
    22. k--;
    23. }
    24. }
    25. }
    26. return new ArrayList<>(result);
    27. }
    1. public List<List<Integer>> threeSum(int[] nums) {
    2. if (nums.length < 3) {
    3. return new ArrayList<>();
    4. }
    5. HashSet<List<Integer>> result = new HashSet<>();
    6. HashMap<Integer ,Integer> map = new HashMap();
    7. Arrays.sort(nums);
    8. for (int i = 0; i < nums.length; i++) {
    9. map.put(nums[i],i);
    10. }
    11. for (int i = 0; i < nums.length - 2; i++) {
    12. if (i >=1 && nums[i] == nums[i - 1]) {
    13. continue;
    14. }
    15. for (int j = i + 1; j < nums.length - 1; j++) {
    16. int target = -nums[i] - nums[j];
    17. // map.get(target) > j 防止重复包含自己
    18. if (map.containsKey(target) && map.get(target) > j) {
    19. result.add(Arrays.asList(nums[i], target, nums[j]));
    20. }
    21. }
    22. }
    23. return new ArrayList<>(result);
    24. }