1. 程式人生 > >[leetcode]47. Permutations II,python實現

[leetcode]47. Permutations II,python實現

題目:

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