【leet-code清晰解题思路】47. 全排列 II

94 阅读1分钟

题目描述

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

输入: nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

示例 2:

输入: nums = [1,2,3]
输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

提示:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

解题思路

  • 这一题与上一题很像,区别就是有重复的数,并且每个数只能用一次。
  • 对于避免重复,我们的策略还是先排序,对于相同的数,只使用最前面的即可。例如有五个1,只用第一个1、只用前两个、前三个、前四个、前五个。这样子就能避免重复。
func permute2(nums []int) [][]int {
   sort.Ints(nums)
   ans = make([][]int, 0)
   m := make([]bool, len(nums))
   tmp := make([]int, 0)
   dfs3(m, 0, nums, tmp)
   return ans
}

func dfs3(m []bool, n int, nums, tmp []int) {
   fmt.Println(tmp)
   if n == len(nums) {
      t := make([]int, len(tmp))
      copy(t, tmp)
      ans = append(ans, t)
      return
   }
   for i := 0; i < len(nums); i++ {
      for i > 0 && i < len(nums) && nums[i] == nums[i-1] && (len(tmp) == 0 || len(tmp) > 0 && tmp[len(tmp)-1] != nums[i]) {
         i++
      }
      if i < len(nums) && m[i] == false {
         m[i] = true
         tmp = append(tmp, nums[i])
         dfs3(m, n+1, nums, tmp)
         tmp = tmp[:len(tmp)-1]
         m[i] = false
      }
   }
}