我有一个解决方案,似乎通过了大多数测试,但太慢了如果我没有错,复杂性是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/