1. 程式人生 > >LeetCode47. 全排列 II

LeetCode47. 全排列 II

題目大意:給定一個含有重複元素的序列,返回這個序列所有不重複的全排列

題目分析:與最基本的全排列遞迴演算法相比,本題要對重複的元素進行特別的處理。例如序列“112”,第一個1和第二個1就不需要交換了,因為交換前後排列的序列是重複的。例如序列“211”,當“2”與第一個“1”交換了之後,變成第一個數字是1,後兩個數12全排列。這種情況和“2”與第二個“1”交換了之後的情形是一樣的。

簡而言之,只要要處理數字放進一個list中,如果之前出現過,那就不需要處理了。

程式碼展示:

class Solution(object):
    def permuteUnique(self, nums):
        numsLen = len(nums)
        result = []
        self.compute(result,nums,0,numsLen-1)
        return result
    
    def compute(self,result,nums,m,n):
        if m==n:
            temp = []
            for i in range(0,len(nums)):
                temp.append(nums[i])
            result.append(temp)
        else:
            flag = []
            for i in range(m,n+1):
                if nums[i] not in flag:
                    flag.append(nums[i])
                    nums[i],nums[m] = nums[m],nums[i]
                    self.compute(result,nums,m+1,n)
                    nums[m],nums[i] = nums[i],nums[m]