1. 程式人生 > >LeetCode演算法題47:全排列 II解析

LeetCode演算法題47:全排列 II解析

給定一個可包含重複數字的序列,返回所有不重複的全排列。

示例:

輸入: [1,1,2]
輸出:
[
  [1,1,2],
  [1,2,1],
  [2,1,1]
]

這個題和上一個題全排列是一樣的,只是在判斷條件中在加一些防止重複元素重複出現的元素就可以了。這裡加到最裡面。

C++原始碼:

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        vector<vector<int
>> res; vector<int> out; vector<int> flag(nums.size(), 0); sort(nums.begin(), nums.end()); permuteUniqueDFS(nums, 0, flag, out, res); return res; } void permuteUniqueDFS(vector<int>& nums, int layer, vector<int>& flag,
vector<int>& out, vector<vector<int>>& res) { if(layer>=nums.size()) res.push_back(out); else { for(int i=0;i<nums.size();i++) { if(flag[i]==0) { if(i>0 &&
nums[i]==nums[i-1] && flag[i-1]==0) continue; out.push_back(nums[i]); flag[i] = 1; permuteUniqueDFS(nums, layer+1, flag, out, res); out.pop_back(); flag[i] = 0; } } } } };

python3原始碼:

class Solution:
    def permuteUnique(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        res = []
        out = []
        flag = [0 for i in range(len(nums))]
        nums.sort()
        self.permuteUniqueDFS(nums, 0, flag, out, res)
        return res
    
    def permuteUniqueDFS(self, nums, layer, flag, out, res):
        if layer >= len(nums):
            res.append(copy.deepcopy(out))
        else:
            for i in range(len(nums)):
                if flag[i] == 0:
                    if i>0 and nums[i]==nums[i-1] and flag[i-1]==0:
                        continue
                    out.append(nums[i])
                    flag[i] = 1
                    self.permuteUniqueDFS(nums, layer+1, flag, out, res)
                    out.pop()
                    flag[i] = 0