###### tags: `Leetcode` `medium` `backtracking` `python`
# 47. Permutations II
## [題目連結:] https://leetcode.com/problems/permutations-ii/
## 題目:
Given a collection of numbers, ```nums```, that might contain duplicates, return all possible unique permutations **in any order**.
**Example 1:**
```
Input: nums = [1,1,2]
Output:
[[1,1,2],
[1,2,1],
[2,1,1]]
```
**Example 2:**
```
Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
```
## 解題想法:
兄弟題目: [46. Permutations](/YKgBx4aeRFyb5g92rTknWg)
* 此題要求,給一數組,可能有含重複元素,求其所有排列組合(組合不能重複)
* 解題:
* 需先將數組排序好
* visited[]: 紀錄該位置是否訪問過
* 進入遞迴:
* 若當前位置已經拜訪過了:continue
* 若與前一個位置的數相同,且前一個位置還沒拜訪過,則當前不能先拜訪:continue
## Python:
``` python=
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res=[]
visited=[False]*len(nums) #紀錄該位置是否訪問過
nums.sort() #先排序 避免重複
self.dfs(nums,[],visited)
return self.res
def dfs(self,nums,path,visited):
if len(path)==len(nums):
self.res.append(path)
return
for i in range(len(nums)):
#若當前位置已經拜訪過了,跳過
if visited[i]:
continue
#若與前一個位置的數相同,且前一個位置還沒拜訪過,則當前不能先拜訪
if i>0 and nums[i]==nums[i-1] and not visited[i-1]:
continue
visited[i]=True
self.dfs(nums,path+[nums[i]],visited)
visited[i]=False
if __name__ == '__main__':
result = Solution()
nums = [0,1,0,0,9]
ans = result.permuteUnique(nums)
print(ans,len(ans))
```