15. 三数之和

123 阅读1分钟

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

解题思路:
先把数组排序,
在这里插入图片描述
从-1开始到1结束,
每次循环都判断当前位置加上开头结尾是不是为0,分为三种情况
是0的话添加到set中,小于0开头指针加一,大于0,结尾指针减一,一直到开头结尾指针等于当前位置。
最后返回。

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        Set<List<Integer>> res = new HashSet<>();

        for (int i = 1; i < nums.length - 1; i++) {
            int l = 0, r = nums.length - 1;
            while (l < i && r>i) {
                if (nums[i] + nums[l] + nums[r] == 0) {
                    if (i > 1 && nums[i] == nums[i - 1] && nums[i - 1] == nums[i - 2]) break;
                    List<Integer> temp = new ArrayList<>();
                    temp.add(nums[l]);
                    temp.add(nums[i]);
                    temp.add(nums[r]);
                    res.add(temp);
                    l++;
                    r--;
                }
                if (nums[i] + nums[l] + nums[r] < 0) {
                    l++;
                }
                if (nums[i] + nums[l] + nums[r] > 0) {
                    r--;
                }
            }

        }
        return new ArrayList<>(res);
    }
}