Algorithm 优化发现所有3个整数相加为零

Algorithm 优化发现所有3个整数相加为零,algorithm,Algorithm,给定一个数组n,我想找到所有不同的a,b,c元素,使得a+b+c=0。例如,想象一下 n = [-1, 0, 1, 2, -1, -4] 结果应该是 [ [-1, 0, 1], [-1, -1, 2] ] 我提出了以下算法,我认为它给出了O(n^2)的复杂性。我的问题是,我们能提高计算效率吗 class Solution { public List<List<Integer>> threeSum(int[] nums) { Set<Lis

给定一个数组n,我想找到所有不同的a,b,c元素,使得a+b+c=0。例如,想象一下

n = [-1, 0, 1, 2, -1, -4]
结果应该是

[ [-1, 0, 1], [-1, -1, 2] ]
我提出了以下算法,我认为它给出了O(n^2)的复杂性。我的问题是,我们能提高计算效率吗

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

        Arrays.sort(nums);

        int leadingPointer, tailPointer, container;
        for(int i=0; i<nums.length-2; i++){
            leadingPointer = i+1;
            tailPointer = nums.length-1;
            while(leadingPointer<tailPointer){
                container = nums[i] + nums[leadingPointer] + nums[tailPointer];
                if(container == 0){
                     collection.add(new ArrayList<Integer> (Arrays.asList(
                            nums[i],
                            nums[leadingPointer],
                            nums[tailPointer]
                    )));
                    tailPointer--;
                    leadingPointer++;
                } else if(container > 0){
                    tailPointer--;
                } else{
                    leadingPointer++;
                }
            }
        }

        List<List<Integer>> finalResult = new ArrayList<List<Integer>>();
        finalResult.addAll(collection);

        return finalResult;
    }
}
类解决方案{
公共列表三和(int[]nums){
Set collection=newhashset();
数组。排序(nums);
int引线指针、尾端指针、容器;

对于(int i=0;i使用嵌套循环,将集合
N
的每个元素用作
a
。现在将集合
N中不包括a的每个元素用作
b
。现在检查集合
N不包括a和b
是否包含值
-a-b
,如果是,则添加
[a,b,-a-b]
到答案集中。若问题是为了找到不同的可能性,您可能需要从答案集中删除重复项。

听起来很像子集和问题。它是np完全问题。这是问题的扩展(只需要确定找到一个三元组的可能性)有一些次二次算法可以解决3SUM,但它们一点都不平凡。