题目描述:
    image.png
    输入输出Demo:
    image.png
    解析:在LeetCode上本题属于Medium难度。TwoSum的升级版,不是很难,采用双指针,先排序,首先定一个数,其余的数就用两个指针逼近。

    1. class Solution {
    2. public List<List<Integer>> threeSum(int[] nums) {
    3. Arrays.sort(nums);
    4. List<List<Integer>> res = new ArrayList<>();
    5. for (int i = 0; i < nums.length - 2; i++) {
    6. int l = i + 1, r = nums.length - 1;
    7. if (i > 0 && nums[i] == nums[i - 1]) { //防止固定到相同的数,即,遇到相同的数就跳过
    8. continue;
    9. }
    10. while (l < r) {
    11. if (nums[i] + nums[l] + nums[r] > 0) { //表明r的数大了
    12. r--;
    13. } else if (nums[i] + nums[l] + nums[r] < 0) { //表明l的数小了
    14. l++;
    15. } else {
    16. //满足条件
    17. List<Integer> currRes = new ArrayList<>();
    18. currRes.add(nums[i]);
    19. currRes.add(nums[l]);
    20. currRes.add(nums[r]);
    21. res.add(currRes);
    22. //去重
    23. while (l < r && nums[l] == nums[l + 1]) { //双指针逼近过程中也要去重
    24. l++;
    25. }
    26. while (l < r && nums[r] == nums[r - 1]) {
    27. r--;
    28. }
    29. l++;
    30. r--;
    31. }
    32. }
    33. }
    34. return res;
    35. }
    36. }