我正在尝试解决3Sum问题(leetcode 15),我使用javascript,但是有一个错误,看起来我的内存已用完,但我很确定我有足够的内存。
这是我的代码:
let threeSum = function(nums){
if(nums instanceof Array !== true){
console.log("Error! The input should be an array!");
return;
} else if(nums.length == 3 && (nums[0] + nums[1] + nums[2] === 0)) {
return [nums];
} else {
let len = nums.length;
let set = [], sum;
let sortedArray = nums.sort((a, b) => a - b);
for(let i = 0; i < len; i++){
if(i !== 0 && sortedArray[i] == sortedArray[i - 1]) continue;
let j = i + 1, k = len - 1;
while(j < k){
sum = sortedArray[i] + sortedArray[j] + sortedArray[k];
if(sum === 0){
set.push([sortedArray[i], sortedArray[j], sortedArray[k]]);
while((j + 1 < k) && (sortedArray[j] === sortedArray[j + 1])){
console.log("j = " + j);
j++;
}
while((k - 1 > j) && (sortedArray[k - 1] === sortedArray[k])){
console.log("j = " + j);
k--;
}
} else if(sum > 0) {
k--;
} else {
j++;
}
}
}
console.log(set);
return set;
}
};
错误信息是:
FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
答案 0 :(得分:0)
您有一个无限循环,因为您需要在j
的while情况结束时递增k
并递减sum === 0
。可能存在其他情况,其中索引i
处的三个数字加起来为0,因此您需要检查它们并相应地更新j
和k
。
function threeSum(nums) {
if(nums instanceof Array !== true){
console.log("Error! The input should be an array!");
return;
} else if(nums.length == 3 && (nums[0] + nums[1] + nums[2] === 0)) {
return [nums];
} else {
let len = nums.length;
let set = [], sum;
let sortedArray = nums.sort((a, b) => a - b);
for(let i = 0; i < len; i++){
if(i !== 0 && sortedArray[i] == sortedArray[i - 1]) continue;
let j = i + 1, k = len - 1;
while(j < k){
sum = sortedArray[i] + sortedArray[j] + sortedArray[k];
if(sum === 0){
set.push([sortedArray[i], sortedArray[j], sortedArray[k]]);
while((j + 1 < k) && (sortedArray[j] === sortedArray[j + 1])){
console.log("j = " + j);
j++;
}
while((k - 1 > j) && (sortedArray[k - 1] === sortedArray[k])){
console.log("j = " + j);
k--;
}
j++;
k--;
} else if(sum > 0) {
k--;
} else {
j++;
}
}
}
return set;
}
}
const arr = [-1, 0, 1, 2, -1, -4];
threeSum(arr); // [-1, -1, 2], [-1, 0, 1];