47.M 全排列 II
Problem: 47. 全排列 II
思路
对于有重复数字的情况,需要先对数组进行排序。
要解决重复问题,我们只要设定一个规则,保证在填第 idx
个数的时候重复数字只会被填入一次即可。而在本题解中,我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中「从左往右第一个未被填过的数字」
Code
func permuteUnique(nums []int) [][]int {
sort.Ints(nums)
var ans [][]int
var path []int
var vis = make([]bool, len(nums))
backtrack(nums, 0, vis, path, &ans)
return ans
}
func backtrack(nums []int, start int, vis []bool, path []int, ans *[][]int) {
if len(path) == len(nums) {
*ans = append(*ans, append([]int{}, path...))
return
}
for i := 0; i < len(nums); i++ {
if vis[i] || (i > 0 && nums[i] == nums[i-1] && !vis[i-1]) {
continue
}
vis[i] = true
path = append(path, nums[i])
backtrack(nums, start+1, vis, path, ans)
vis[i] = false
path = path[0 : len(path)-1]
}
}
Last updated
Was this helpful?