leetcode题库——全排列II

版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83861632

题目描述:

给定一个可包含重复数字的序列,返回所有不重复的全排列。

示例:

输入: [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.

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

本题中没有对初始数字序列排序,而在去重时,为了查看相邻同样的数字是不是在上一步中用过(因为如果用过,会造成重复),所以需要先排序。

猜你喜欢

转载自blog.csdn.net/Dorothy_Xue/article/details/83861632