题目描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
解题思路1:
- 采用广度优先搜索的思路,先假设全排列里只用了一个元素,然后再迭代的加入其他的元素,每次加入元素时分别对之前的全排列的结果在所有位置均可插入当前元素;
- 需要注意的是需要考虑添加元素时不能改变原来的结果,因此使用深拷贝来进行备份;
代码1:
import copy
class Solution(object):
def permuteUnique(self, nums):
if not nums:
return []
# 注意这里是返回[nums], 因为最后返回要求是一个List[List]。
ret = [[nums[0]]]
flag = {}
for i in range(1, len(nums)):
iteam = nums[i]
ret_copy = copy.deepcopy(ret) # 深copy上一轮的返回值,避免对原始值产生修改
curr = []
for ls in ret_copy:
for j in range(len(ls)+1):
ls_copy = copy.deepcopy(ls)
ls_copy.insert(j, iteam)
ls_copy_str = ','.join([str(i) for i in ls_copy])
if ls_copy_str not in flag:
curr.append(ls_copy)
flag[ls_copy_str] = 1
ret, curr = curr, ret
return ret
s = Solution()
nums = [1, 1, 2]
print(s.permuteUnique(nums))
参考链接:
[1]. [LeetCode 47] 全排列 II