47. 全排列 II

题目描述:

47. 全排列 II_第1张图片

主要思路:

这是一个搜索的剪枝问题,利用条件去除重复的全排列。
主要就是同一层级的同一位置上不能有相同的数字。
需要保证相同的数字是从左到右依次填进去的,如果上一个相同的字没填 下一个就不能开始被填。

class Solution {
public:
    int n;
    vector<vector<int>> ans;
    bool book[20];
    void dfs(int index,vector<int> nowans,vector<int> nums)
    {
        if(index==n)
        {
            ans.push_back(nowans);
            return;
        }
        for(int i=0;i<n;++i)
        {
            if(i>0&&nums[i-1]==nums[i]&&!book[i-1])
                continue;
            if(!book[i])
            {
                book[i]=1;
                nowans.push_back(nums[i]);
                dfs(index+1,nowans,nums);
                nowans.pop_back();
                book[i]=0;
            }
        }
    }
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        n=nums.size();
        sort(nums.begin(),nums.end());
        vector<int> nowans;
        dfs(0,nowans,nums);
        return ans;
    }
};

你可能感兴趣的:(Leetcode,深度优先,算法,leetcode)