第一道题是没有重复的情况下,输出一个list的所有排列情况
Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
考虑使用递归的情况。先从1开始循环,如果没有所在子集中,加入子集;如果在子集中,就跳过这个循环。然后递归,判断是否在子集中,直到达到给定nums的长度。如果达到长度,就代表是所求结果,放到结果集中。递归后面要把集合删掉一部分,保证后面循环可以加进去。
class Solution:
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res=[]
sub=[]
self.dfs(nums,sub)
return self.res
def dfs(self,Nums,subList):
if len(subList)==len(Nums):
self.res.append(subList[:])
for m in Nums:
if m in subList:
continue
subList.append(m)
self.dfs(Nums,subList)
subList.remove(m)
第二道题是在有重复数据的情况下给出全排列。可以使用上面方法。但是需要注意的是,循环过程中不能再用这个值是不是在子集中来判断了,应为里面有重复值,可能下个值和前一个值一样。所以这个时候引入了一个flagList,长度和给定的nums长度一样,用来标记是否已经放入子集中。如果已经放入子集,就判断下一个,如果没有,就可以把他放入子集中。这个时候不能再用子集来遍历,要用序号遍历,才能标记对应的值是否已经加入子集。因为有重复的值,所以最后的值会出现重复,所以要判断子集是否已经在结果集中,再加入结果集中。最后需要注意的是刚move出去的值和下一个即将进入的值一样,所以用last存储刚pop的值,用m表示当前值,通过比较两个值是否一样,来判断是否使用当前值。
class Solution:
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res=[]
sublist=[]
nums=sorted(nums)
self.flagList=[0]*len(nums)
self.digui(sublist,nums)
return self.res
def digui(self,sublist,nums):
if(len(sublist)==len(nums) and (sublist not in self.res)) :
self.res.append(sublist[:])
last=None
for i in range(len(nums)):
m=nums[i]
if(self.flagList[i]==1):
continue
if last==m:
continue
sublist.append(nums[i])
self.flagList[i]=1
self.digui(sublist,nums)
last=sublist.pop()
self.flagList[i]=0