首页 > 解决方案 > 为什么这段代码返回一个空数组?

问题描述

问题:给定一个不同整数的集合,返回所有可能的排列。

示例:输入:[1,2,3]

所需输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1 ]]

JavaScript 中的数组不是通过引用传递的吗?为什么我返回结果数组时为空?

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
  var result = [];
  helper(nums, result, []);
  return result;
};

var helper = function(nums, result, cur) {
  if (cur.length == nums.length) {
    result.push(cur);
  } else {
    for (let i = 0; i < nums.length; i++) {
      cur.push(nums[i]);
      helper(nums, result, cur);
      cur.pop();
    }
  }
}
console.log(permute([1, 2, 3]));

标签: javascriptalgorithmrecursiondata-structurespermutation

解决方案


当您调用时,您只会创建一个cur数组helper

helper(nums, result, []);

您继续变异并递归地传递helper. 内存中只有一个数组;到最后,您已经.popped 了数组中的最后一项,并且数组中的每个项都result指向同一个对象,即现在为空的cur数组。

相反,cur在循环内克隆,以便当/如果它被推送时,您正在推送一个数组,而不是对旧数组的引用,它将在任何地方重用:

for (let i = 0; i < nums.length; i++) {
  const temp = cur;
  cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
  helper(nums, result, cur);
  cur = temp; // Similar to `.pop` - reverts the array to what it was originally
}

var permute = function(nums) {
  var result = [];
  helper(nums, result, []);
  return result;
};

var helper = function(nums, result, cur) {
  if (cur.length == nums.length) {
    result.push(cur);
  } else {
    for (let i = 0; i < nums.length; i++) {
      const temp = cur;
      cur = [...cur, nums[i]]; // Similar to `.push`, except it creates a new array
      helper(nums, result, cur);
      cur = temp; // Similar to `.pop` - reverts the array to what it was originally
    }
  }
}

console.log(permute([1, 2, 3]));


推荐阅读