题目:给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例: 输入:[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]
来源:https://leetcode-cn.com/problems/permutations-ii/
法一:自己的代码
思路:要学会画树状图来观察数据的特征和结构,通过画图可以发现要先对list排序,如果发现某个数字连续出现了两次,则没有必要继续回溯了用continue结束本次for循环.
class Solution: def permute(self, nums): resluts = [] # 这个问题必须要排序 nums = sorted(nums) l = len(nums) # 注意这里的nums如果不初始化的话,要放在a的前边,否则报错. def backtrack(a=[], nums=nums): # 深度优先遍历,即回溯终止的条件 if len(a) == l: resluts.append(a) return for j,i in enumerate(nums): # 通过观察可以发现,每次回溯的时候,不管是外面的大循环还是里面的小循环, # 比如3在[0,3,3,3]中出现了三次,如果3连续出现了两次这个时候就没必要再循环了 if (j !=0) & (nums[j] == nums[j-1]): # 之前用return是错误的,因为这里仅仅是想结束一次for循环, # 如果用return的话,直接结束了回溯函数 #return continue # 每次回溯前,都将该数删除,为了下次回溯for循环的时候不再用 # 这里没有用状态重置是因为 回溯时用了r来赋值给nums,每次回溯结束后仍然是原来的状态 r = nums.copy() del r[j] # 这里的i必须加[] # backtrack( a+[i], [k for k in nums if k != i]) backtrack( a+[i], r, ) backtrack() return resluts if __name__ == "__main__": duixiang = Solution() a = duixiang.permute([3,3,0,3]) # a = duixiang.permute([1,1,2]) print(a)View Code