Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解题思路
- 注意结果存储需要单独拷贝副本,放置被意外篡改
- 切片因为扩容的原因,是不可靠的引用传递,需要将其转换为值传递(副本拷贝)
- 不重复的关键就是当前位置相同的数字只放一次就好了
func core(cur, remain []int, result *[][]int) {
if len(remain) == 0 {
cur_t := make([]int, len(cur))
copy(cur_t, cur) // 注意拷贝副本存结果
*result = append(*result, cur_t)
return
}
for i := 0; i < len(remain); i++ {
v := remain[i]
// 新建副本 remain_t
remain_t := make([]int, len(remain[:i]))
copy(remain_t, remain[:i])
remain_t = append(remain_t, remain[i+1:]...)
// 这里 cur 不需建立副本,因为下次循环会覆盖之前的修改
core(append(cur, v), remain_t, result)
for j := i + 1; j < len(remain); j++ {
// 不要用 != ,因为可能一直到最后都是 ==
if remain[j] == v {
i++
} else {
break
}
}
}
}
func permuteUnique(nums []int) [][]int {
sort.Ints(nums)
result := [][]int{}
core([]int{}, nums, &result)
return result
}