题目描述
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入:
[1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路
这道题是上一道题的延伸,由于数组中有可能会出现重复的数字,按照之前的算法会有重复排列产生,因此我们需要判断前面一个数和当前的数是否相等,如果相等,且其对应的visited的值为1,当前数字才能使用,否则需要跳过,这样就不会产生重复排列了。下面方式一就是在排列一的基础上进行剪枝判断。
方式二则使用了set的天然去重功能实现的,总的来说方式二简单一些。
实现代码
方式一
1 | class Solution { |
方式二
1 | class Solution { |
对于上面的方式二你可能还是疑惑的,我们明明剪枝了为什么还要set
的去重?是不是有点重复对于了,其实不然,我们还原用vector
数组,并且在主函数调用递归之前给nums排个序,然后测试【1,2,2】,得到结果:
[[1,2,2],[2,1,2],[2,2,1],[2,2,1],2,1,2]]
你会发现结果还是有重复的,那么上面的剪枝到底有啥用?做了啥?
其实,那个剪枝只是为了防止当start=1,i=2时,将两个2交换,这样可以防止(1,2,2)被放入两次。