Javascript leetcode 3sum帮助,如何优化此答案?

Javascript leetcode 3sum帮助,如何优化此答案?,javascript,algorithm,Javascript,Algorithm,我有一个解决方案,似乎通过了大多数测试,但速度太慢。如果我没有弄错的话,由于三个for循环,复杂性是O(n^3) 我的想法是从数组的前三个位置i、j和k开始,将它们相加,看看它是否等于0 功能目标是: 给定一个由n个整数组成的数组nums,nums中是否有元素a、b、c使得a+b+c=0?查找数组中所有唯一的三元组,该数组的和为零 注意: 解决方案集不得包含重复的三元组 示例: 给定数组nums=[-1,0,1,2,-1,-4] 解决方案集是: [ [-1, 0, 1], [-1, -1

我有一个解决方案,似乎通过了大多数测试,但速度太慢。如果我没有弄错的话,由于三个for循环,复杂性是O(n^3)

我的想法是从数组的前三个位置i、j和k开始,将它们相加,看看它是否等于0

功能目标是:

给定一个由n个整数组成的数组nums,nums中是否有元素a、b、c使得a+b+c=0?查找数组中所有唯一的三元组,该数组的和为零

注意: 解决方案集不得包含重复的三元组

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

解决方案集是:

[
  [-1, 0, 1],
  [-1, -1, 2]
]
var threeSum=函数(nums){
var originalArray=nums
var lengthArray=nums.length
//将数组从最小到最大排序
nums.sort(函数(a,b){
返回a-b
})
函数arrayEqual(array1,array2){
var相等=错误
数组1.forEach((值1)=>{
if(array1==array2){
相等=真
}
})
回报相等
}
var总和=0;
var answerArray=[];
//从第一个数字开始,然后从那里添加

对于(var i=0;i用这种方式思考这个问题。从数组中选择任意一个数字,比如说
k
。现在你需要在数组中找到另外两个数字,它们相加到
-k
。三个数字的结果之和将是
k+(.k)=0

因此,这个问题被简化为在数组中找到两个数字,如果给定的数组被排序,则使用双指针方法将两个数字相加到一个给定的数字,即
O(n)

简言之,对数组进行排序,一个接一个地取每个数字(k)(O(n))
,用sum-k
(O(n))
找到另外两个数字


总时间复杂度:O(n)*O(n)=O(n2)

您可以在运行时
O(n^2)
解决此问题

    var threeSum = function(nums) {
    var solutions = [];
    var target = 0;
    nums.sort(function(a, b) {
        return a - b;
    });
    for(var i = 0; i < nums.length - 2; i++) {
        if(i === 0 || (i > 0 && nums[i] !== nums[i - 1])) {
        var lo = i + 1;
        var hi = nums.length - 1;
        var sum = - nums[i];
        while(lo < hi) {
            if(nums[lo] + nums[hi] === sum) {
                solutions.push([nums[i],nums[lo],nums[hi]]);
                while (lo < hi && nums[lo] === nums[lo + 1]) lo++;
                while (lo < hi && nums[hi] == nums[hi-1]) hi--;
                lo++; hi--;
            }else if (nums[lo] + nums[hi] > sum) {
                hi--;
            }else {
                lo++;
            }
        }
        }
};
    return solutions;
}
var threeSum=函数(nums){
var解决方案=[];
var目标=0;
nums.sort(函数(a,b){
返回a-b;
});
对于(变量i=0;i0&&nums[i]!==nums[i-1])){
var lo=i+1;
var hi=nums.length-1;
var总和=-nums[i];
while(losum){
嗨——;
}否则{
lo++;
}
}
}
};
返回解决方案;
}

OP试图解决@CertainPerformance,这是我问的问题的底线:如何避免使用三个for循环来实现这一点(也就是如何优化此解决方案?)问题没有提到
n
的最大值,但我的假设是您需要O(n^2)通过所有测试用例。如果您选中“讨论”在问题页面的这一部分,您应该找到很多解决方案,并进行了很好的解释。为什么for循环中nums.length上的-2?我会得到-1,但得到2?因为第一个元素的索引可以是最大的
nums.length-3
,第二个元素的最大索引可以是
nums.length-2
,第三个元素的长度可以是最大的m
nums.length-1
。您为什么提到摊销?