Permutations / Permutations II

方法:采用递归的方式

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        vector<bool> visit(nums.size(), false);
        
        vector<int> path;
        dfs(nums, path, visit, result);
        
        return result;
    }
    
private:
    void dfs(const vector<int> &nums, vector<int> &path, vector<bool> &visit, vector<vector<int>> &result)
    {
        if(path.size() == nums.size())
        {
            result.push_back(path);
            return;
        }
        
        for(int i=0; i<nums.size(); ++i)
        {
            if(!visit[i])
            {
                visit[i] = true;
                path.push_back(nums[i]);
                dfs(nums, path, visit, result);
                visit[i] = false;
                path.pop_back();
            }
        }
    }
};

或者使用查找的方式代替visit参数

class Solution {
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        
        dfs(nums, path, result);
        return result;
    }
    
private:
    void dfs(const vector<int> &nums, vector<int> &path, vector<vector<int>> &result)
    {
        if(path.size() == nums.size())
        {
            result.push_back(path);
            return;
        }
        
        for(int i=0; i<nums.size(); ++i)
        {
            if(find(path.begin(), path.end(), nums[i]) == path.end())
            {
                path.push_back(nums[i]);
                dfs(nums, path, result);
                path.pop_back();
            }
        }
    }
};

对于Permutations II,只需判断现在访问到的数字与前一个是否相同即可。

class Solution {
public:
    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        
        vector<vector<int>> result;
        vector<bool> visit(nums.size(), false);
        
        vector<int> path;
        dfs(nums, path, visit, result);
        
        return result;
    }
    
private:
    void dfs(const vector<int> &nums, vector<int> &path, vector<bool> &visit, vector<vector<int>> &result)
    {
        if(path.size() == nums.size())
        {
            result.push_back(path);
            return;
        }
        
        for(int i=0; i<nums.size(); ++i)
        {
            if(i > 0 && nums[i] == nums[i-1] && visit[i-1])
                continue;
            if(!visit[i])
            {
                visit[i] = true;
                path.push_back(nums[i]);
                dfs(nums, path, visit, result);
                visit[i] = false;
                path.pop_back();
            }
        }
    }
};

 

posted @ 2017-05-07 15:30  chengcy  Views(128)  Comments(0)    收藏  举报