我有一个解决方案,似乎通过了大多数测试,但太慢了如果我没有错,复杂性是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 = function(nums) {
    var originalArray = nums
    var lengthArray = nums.length

    //sort array smallest to largest
    nums.sort(function(a,b) {
        return a-b
    })

    function arrayEqual(array1, array2){

        var equal = false
        array1.forEach((value1) => {
            if(array1 === array2){

                equal = true
            }
        })
        return equal
    }

    var sum = 0;
    var answerArray = [];
    //start from first digit and add from there
    for(var i = 0; i<lengthArray; i++){
        for(var j = i+1; j<lengthArray; j++){
            for(var k = j+1; k<lengthArray; k++){
                if((nums[i]+nums[j]+nums[k] === 0)){
                    if(!arrayEqual(answerArray, [nums[i],nums[j],nums[k]])){
                        answerArray.push([nums[i],nums[j],nums[k]])
                    }
                }
            }
        }
    }

    return Array.from(new Set(answerArray.map(JSON.stringify)), JSON.parse)
};

我怎样才能避免不得不使用三个for循环来实现这一点(又称如何优化这个解决方案?)

最佳答案

用这种方式思考这个问题从数组中选择任意数字,如k。现在,您需要在数组中找到另外两个数字,它们添加到-k得到的三个数字之和将是k + (-k) = 0
因此,如果对给定的数组进行排序,则使用双指针方法将此问题简化为在数组中找到两个数字,这两个数字加在一个O(n)的给定数字上。
简而言之,对数组进行排序,将每个数字(k)逐个(O(n)),然后用sum-k(O(n))找到另外两个数字。
总时间复杂度:O(n)*o(n)=o(n2)

关于javascript - leetcode 3sum协助,如何优化此答案?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50671178/

10-12 20:46