题解 | #56.有重复项数字的全排列#

有重复项数字的全排列

http://www.nowcoder.com/practice/a43a2b986ef34843ac4fdd9159b69863

用一个临时数组path存储排列的情况,用一个数组used表示数组中每个元素的访问情况

  • 终止条件:临时数组中选取了n个元素,将其加入到结果中

  • 本级任务:选择一个元素push到临时数组。已经加入的元素不能再加入(通过used数组帮助)。为了去除重复元素的影响,如果当前元素num[i]与num[i-1]相同且num[i-1]没有使用过,也不要将其纳入

    例子:1,2,2,3

    选取1,选取2,然后2和3排列有23和32情况,

    选取1,选取第二个2,由于num[2]==num[1] && !num[1]=true,所以直接continue,避免了重复情况,虽然如此,但是,我还是不太理解这个判断条件,



/**
 * 
 * @param num int整型一维数组 
 * @return int整型二维数组
 */
 function permuteUnique( num ) {
  num = num.sort((a,b)=>a-b);//数组进行排序
  
  let result = [];//结果数组
  let path = [];//临时临时排列的数组
  let used = [];
  function backTrack(num){
    if(path.length == num.length){
      result.push([...path]);
      return;
    }
    for(let i=0; i<num.length; i++){//遍历所有元素选取一个加入
      if(i>0 && num[i]==num[i-1] && !used[i-1])//当前的元素num[i]与同⼀层的前⼀个元素num[i-1]相同且num[i-1]已经⽤过了
        continue;
      if(!used[i]){//如果该元素未被使用
        path.push(num[i]);
        used[i] = true;//标记为使⽤过
        backTrack(num);
        path.pop();//回溯
        used[i] = false;
      }
    }
  }
  
  backTrack(num);
  return result;
}
全部评论
解说部分的判定重复的条件写错了(代码部分是正确的),应该是!used[1]==true
点赞 回复 分享
发布于 2023-02-09 14:28 四川

相关推荐

09-19 14:12
武汉大学 golang
并没有发笔试,只是顺延了两次,去看官网发现流程结束了
无敌忍耐王:三个工作日没人捞就自动结束了
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
3
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务