描述
给出一个具有重复数字的列表,找出列表所有不同的排列。
您在真实的面试中是否遇到过这个题?
样例
给出列表 [1,2,2],不同的排列有:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
挑战
使用递归和非递归分别完成该题。
这一题是上一题的升级版,上一题见:https://blog.csdn.net/wenqiwenqi123/article/details/80539727
这一题和上次那个数字组合ii问题很像,具体见:https://blog.csdn.net/wenqiwenqi123/article/details/80196635
也是两行代码解决问题,但要注意的是在进入递归时需要先给数组排序:
class Solution:
"""
@param: nums: A list of integers.
@return: A list of permutations.
"""
def permuteUnique(self, nums):
# write your code here
def search(nums,lists,index):
if(len(nums)==len(lists)):
self.result.append(lists)
return
for i in range(0,len(nums)):
if(self.flag[i]==1):continue
# 在有重复元素时,如果前面一个没被选到就选了后面的元素,则会重复选取
elif(i!=0 and nums[i]==nums[i-1] and self.flag[i-1]==0):
continue
else :
self.flag[i]=1
search(nums,lists+[nums[i]],index+1)
self.flag[i]=0
self.result=[]
self.flag=[]
for i in range(len(nums)):
self.flag.append(0)
search(sorted(nums),[],0)
return self.result
s = Solution()
print(s.permuteUnique([3,3,0,3]))