1. 程式人生 > >leetcode題庫——全排列II

leetcode題庫——全排列II

題目描述:

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

示例:

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

方法:

class Solution {
public:
    vector<vector<int>> res;
    vector<int> flag;
    int length;

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        if(nums.size()==0) return res;
        length=nums.size();
        int a[length]={0};
        sort(nums.begin(),nums.end());
        dfs(a,nums,0);
        return res;
    }
    
    void dfs(int a[],vector<int>& nums,int deep){
        for(int i=0;i<length;i++){
            if(i>0&&nums[i]==nums[i-1]&&a[i-1]==1) continue;
            if(a[i]==0){
                flag.push_back(nums[i]);
                a[i]=1;
                dfs(a,nums,deep+1);
                flag.pop_back(); 
                a[i]=0;
            }
        }
        if(deep==length) res.push_back(flag); 
    }
};

思路:

為字元序列每個數字設定一個標籤,記錄其是否被記錄到flag中,若已記錄到flag中,則設a[i]為1,否則為0.

遇上提不一樣的是多了一步去重。

本題中沒有對初始數字序列排序,而在去重時,為了檢視相鄰同樣的數字是不是在上一步中用過(因為如果用過,會造成重複),所以需要先排序。