> 文档中心 > LeetCode47-全排列II(Golang)

LeetCode47-全排列II(Golang)

LeetCode47-全排列II

题意:

给定一个nums数组,可能存在重复数字,要求给出这个数组的全排列,且要求给出的全排列不存在重复情况。

思路:

  1. 本题与LC46(LC46题记)类似,利用深度优先搜索(DFS)进行求解。
  2. 但是因为存在重复的数字,就需要引入一些条件判断。
  3. 首先将nums数组进行排序,
  4. 考虑要去除重复的情况,我们可以限制对于重复数字的搜索过程,只能是从前向后,不能是从后向前,
  5. 枚举每一位时,加入如下判断:若 nums[i] 未被访问且 nums[i]==nums[i-1] nums[i-1] 为被访问,则剪去对这一位的枚举。(这样就可以剪去对从后向前的搜索)

        对于第5步的解释:

  • 因为此时, nums[i]==nums[i-1] ,且 nums[i-1] 未被访问,如果不剪去,就将导致下一层搜索,有可能访问到 nums[i-1] (此时的搜索序为 nums[i]->nums[i-1] ),而上一轮对 nums[i-1] 搜索时候已经有过: nums[i-1]->nums[i] ,故需要将这一情况剪枝。

代码(Golang):

func permuteUnique(nums []int) [][]int {    tmp:=make([]int,0)    ans:=make([][]int,0)    vis:=make([]bool,len(nums))    sort.Ints(nums)    var dfs func(now int)    dfs=func(now int){ if now==len(nums){     ans=append(ans,append([]int(nil),tmp...))     return } for i:=0;i0 && nums[i]==nums[i-1] && !vis[i-1]){  continue     }     vis[i]=true     tmp=append(tmp,nums[i])     dfs(now+1)     vis[i]=false     tmp=tmp[:len(tmp)-1] }    }    dfs(0)    return ans}

组词