按照56题的思路可能更简单一点,和56题有重复项数字的全排列代码一样

function permute( num ) {
  
  let path = [];
  let res = [];
  let used = [];
  
  function traceTrack(){
    //path已经达到num长度时
    if(path.length == num.length){
      res.push([...path]);
      return;
    }
    for(let i=0; i<num.length; i++){
      if(i!=0 && num[i]==num[i-1] && !used[i-1])
        continue;
      
      if(!used[i]){
        path.push(num[i]);
        used[i] = true;
        traceTrack();
        used[i] = false;
        path.pop();
      }
    }
  }
  
  traceTrack();
  return res;
}

全排列就是对数组元素交换位置,使得每一种排列都可能出现

递归

  • 终止条件:要交换的下标到了数组末尾,没有可交换的了,这就构成了一个排列情况,加入到结果数组。
  • 本级任务:遍历从它开始的后续元素,每一个就与它交换依次位置 回溯:当1与3交换位置以后,如果2和4再交换位置的时候,我们只能得到3412,无法得到1432。这是因为1和3的交换在2和4交换的前面,递归过程中默认将后者看成前者的子问题,这时就需要回溯,交换回原来的位置。

代码都要背下来了,可是还是不太能理解😅😅😅😅😅😅😅😅,蚌埠住了

 function permute( num ) {
  if(num.length <= 1)
    return [num];
  
  let n = num.length;
  let ans = [];
  
  function swap(left,right){
    let temp = num[left];
    num[left] = num[right];
    num[right] = temp;
  }
  
  function permumation(index){
    if(index >= n){
      ans.push(num);
    }else{
      for(let j=index; j<n; j++){
        swap(index,j);
        permumation(index+1);
        swap(index,j);
      }
    }
  }
  
  permumation(0);
  return ans;
}