题目描述
给定一个可包含重复数字的序列 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
}
}
}