Leetcode:Permutations 排列

戳我去解题

Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

 

解题分析:

方法一:

首先进行排序,保证结果保持字典序,使用STL的算法函数 next_permutation

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int> > res;
        res.push_back(num);
        
        while (next_permutation(num.begin(), num.end())) {
            res.push_back(num);
        }
        return res;
    }
};

 

 方法二:使用自己实现的 NextPermutation

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int> > res;
        res.push_back(num);
        if (num.size() < 2) return res;
        
        while (NextPermutation(num)) {
            res.push_back(num);
        }
        return res;
    }
    
    int NextPermutation(vector<int> &num) {
        int i = 0;
        int k = 0;
        for (i = num.size() - 2; i >= 0; --i) {
            if (num.at(i) < num.at(i+1)) {
                break;
            }
        }
        if (i < 0) {
            reverse(num.begin() + i + 1, num.end());
            return 0;
        }
        
        for (k = num.size() - 1; k > i; --k) {
            if (num.at(k) > num.at(i)) {
                break;
            }
        }
        swap(num.at(i), num.at(k));
        reverse(num.begin() + i + 1, num.end());
        return 1;
    }
};

 

方法三:

扩展节点,每次从左往右遍历num,选取第一个 没有出现在path的元素

class Solution {
public:
    vector<vector<int> > permute(vector<int> &num) {
        sort(num.begin(), num.end());
        vector<vector<int> > res;
        
        vector<int> path;
        dfs(num, path, res);
        return res;
    }
    
    void dfs(vector<int>& num, vector<int>& path, vector<vector<int>>& result) {
        if (path.size() == num.size()) {
            result.push_back(path);
            return;
        }
        
        for (int i = 0; i < num.size(); ++i) {
            auto iter = find(path.begin(), path.end(), num.at(i));
            if (iter == path.end()) {
                path.push_back(num.at(i));
                dfs(num, path, result);
                path.pop_back();
            }
        }
    }
};

 

Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,

[1,1,2] have the following unique permutations:
[1,1,2], [1,2,1], and [2,1,1].

解题分析:

这题主要是去重,我们仍然可以采用 上一题的方法得出最后的结果,然后sort一下,unique去重,然后erase擦除即可

class Solution {
public:
    vector<vector<int> > permuteUnique(vector<int> &num) {
        vector<vector<int>> result;
        if (num.size() == 0) return result;
        sort(num.begin(), num.end());
        
        result.push_back(num);
        while (next_permutation(num.begin(), num.end())) {
            result.push_back(num);
        }
        sort(result.begin(), result.end());
        result.erase(unique(result.begin(), result.end()), result.end());
        return result;
    }
};

 

 

你可能感兴趣的:(LeetCode)