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

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

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4]
满足要求的三元组集合为:

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

首先最容易想到的是三重暴力循环,在不重复三元组的情况下判断是否三数之和为0,是则记录下来
上代码!

public class Test01 {
    public static List<List<Integer>> threeSum(int[] nums) {
        Set<List<Integer>> set = new HashSet<List<Integer>>();
        
        for(int i=0;i<nums.length;i++) {
            for(int j=1;j<nums.length;j++) {
                for(int k=2;k<nums.length;k++) {
                    if(i!=j && i!=k && j!=k) {
                        if(nums[i]+nums[j]+nums[k]==0) {
                            List<Integer> list = new ArrayList<>();
                            list.add(nums[i]);
                            list.add(nums[j]);
                            list.add(nums[k]);
                            Collections.sort(list);
                            set.add(list);
                        }
                    }
                }
            }
        }
        return new ArrayList<List<Integer>>(set);     
    }
}

在执行最后一个测试案例时
超时29秒!!!

显然暴力行不通,换思路!
夹逼法

public class Test02 {
    public static List<List<Integer>> threeSum(int[] nums) {
        if(nums==null||nums.length<3) {
            return Collections.emptyList();
        }
        Set<List<Integer>> set = new HashSet<List<Integer>>();
        Arrays.sort(nums);
        for(int i=0;i<nums.length-2;i++) {
            int begin = i+1;
            int end = nums.length-1;
            
            while(begin < end) {
                int sum = -(nums[begin]+nums[end]);
                if(sum == nums[i]) {
                    List<Integer> list = new ArrayList<>();
                    list.add(nums[begin]);
                    list.add(nums[i]);
                    list.add(nums[end]);
                    Collections.sort(list);
                    set.add(list);
                }
                if(sum <= nums[i]) {
                    end--;
                }else {
                    begin++;
                }
            }            
        }
        return new ArrayList<List<Integer>>(set);
    }
}

54ms
如有更好的解法请动动小手在评论区留言!!!

最后修改:2020 年 09 月 12 日 06 : 05 PM
如果觉得我的文章对你有用,请随意赞赏