leetcode第47题全排列 II

145 阅读1分钟

题目: 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 题目链接

我的JavaScript解法

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
  let result = [];
  let used = new Array(nums.length); //记录是否使用过
  nums.sort((a, b) => (a-b));
  track(nums, [], used, result);
  return result;
};

var track = (nums, path, used, result) => {
  if(path.length == nums.length) {
    result.push([...path]);
    return;
  }
  for (let i = 0; i < nums.length; i++) {
    if (used[i]) continue; //使用过,剪枝
    if (i - 1 >= 0 && nums[i - 1] == nums[i] && !used[i - 1]) 
      continue; // 和前一个相等,剪枝
    path.push(nums[i])
    used[i] = true;
    track(nums, path, used, result);
    path.pop();
    used[i] = false;
  }
}

解析: 同样使用回溯法,但是结束条件不同,需要剪枝