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