[leetcode]47. Permutations II,python實現
阿新 • • 發佈:2019-01-31
題目:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2] have the following unique permutations:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
之前那個是都是不同的數,現在要 有重複的數,
思路還是之前的思路遍歷:
舉個例子[1,1,2]吧
剛開始 第一個值:應該有兩條路 1 和 2(注意不是1,1,2),假設設為x,y
第二個值 x後面有兩條路1,2 ,y後面只有一條路 1(不是兩條路1,1)
第三個值 x後面的兩條路分別只有最後一個值2,1,y也一樣。
第一個是 最後的結果圖
第二個是 邏輯圖
畫個圖就是:
那不一樣在哪呢。
這裡的同一層重複的路徑不再走了
就在每次有重複的時候,比如一開始的1,1,2。所有重複路徑 都合為一個。
其他的和PermutationsI都一樣。
因此我們需要加一個flagList來告訴我們哪個值之前走過,還要記錄上一個比如
第一個值 我已經走過一次1了,就不再走1了。
程式碼如下:
class Solution(object):
def permuteUnique(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
self.res = []
sub = []
nums = sorted(nums)
fl = [0]*len(nums)
self.dfs(nums,[],fl)
return self.res
def dfs(self, Nums, subList,flagList):
if len(subList) == len(Nums):
#print res,subList
self.res.append(subList[:])
last = None
for idx in range(len(Nums)):
m = Nums[idx]
if flagList[idx]==1:
continue
if last == m:
continue
flagList[idx] = 1
subList.append(m)
self.dfs(Nums,subList,flagList)
last = subList.pop()
flagList[idx] = 0