刷题46. Permutations

一、题目说明

题目是46. Permutations,给一组各不相同的数,求其所有的排列组合。难度是Medium

二、我的解答

这个题目,前面遇到过类似的。回溯法(树的深度优先算法),或者根据如下求解:

刷题31. Next Permutation

我考虑可以用dp做,写了一个上午,理论我就不说了,自己看代码:

#include
#include
#include

using namespace std;
class Solution{
    public:
        vector> permute(vector& nums) {
            vector> res;
            vector> next;
        
            unordered_map>> dp;
            vector cur;
            
            if(nums.empty()) return res;
            
            cur.push_back(nums[0]);
            res.push_back(cur);
            dp[1] = res;
            int currLength = 2;
            for(int j=1;j nums = {1,2,3,4};
    vector> r = s.permute(nums);
    for(int i=0;i

性能如下:

Runtime: 8 ms, faster than 98.85% of C++ online submissions for Permutations.
Memory Usage: 9.5 MB, less than 46.27% of C++ online submissions for Permutations.

三、优化措施

dp算法,是按照空间换时间的,所以时间还可以,空间就差了点。

下面是回溯算法的代码,可读性好多了:

class Solution{
    private:
        vector> result;
        vector path;
        vector used;
    public:
        //枚举每个位置放哪个数 
        void dfs(const vector&nums,int pos){
            if(pos == nums.size()){
                result.push_back(path);
                return;
            }
            for(int i=0;i> permute(vector& nums) {
            if(nums.empty()){
                return result;
            }

            used.resize(nums.size());
            dfs(nums,0);
            return result;
        }
};

你可能感兴趣的:(刷题46. Permutations)