javascript中的3sum看起来像我的记忆耗尽

时间:2017-09-08 17:19:59

标签: javascript

我正在尝试解决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

1 个答案:

答案 0 :(得分:0)

您有一个无限循环,因为您需要在j的while情况结束时递增k并递减sum === 0。可能存在其他情况,其中索引i处的三个数字加起来为0,因此您需要检查它们并相应地更新jk

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];