Algorithm 优化发现所有3个整数相加为零
给定一个数组n,我想找到所有不同的a,b,c元素,使得a+b+c=0。例如,想象一下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 = [-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,但它们一点都不平凡。