LeetCode Day48

回溯

class Solution {
public:
    string getPermutation(int n, int k) {
        int nums[n];
        for(int i=0;i<n;i++) {nums[i]=i+1;}//cout<<nums[i];}
  //      cout<<endl;
        vector<string> res;
        string out;
        DFS(res,nums,out,0,n);
       // for(int i=0;i<res.size();i++) cout<<res[i]<<' ';
        return res[k-1];
    }
    void DFS(vector<string> &res,int nums[],string out,int depth,int n){
        if(depth==n) res.push_back(out);
        else{
            for(int i=depth;i<n;i++){
                swap(nums[depth],nums[i]);
                sort(nums+depth+1,nums+n);
                DFS(res,nums,out+char(nums[depth]+'0'),depth+1,n);
                sort(nums+depth,nums+n);
                //for(int i=0;i<n;i++) {cout<<nums[i];}
               // cout<<endl;
            }
        }
    }
};

上述方法超出时间、空间限制,所以该题需要找出规律直接输出答案。代码如下:

class Solution {
public:
    string getPermutation(int n, int k) {
        string res;
        string num="123456789";
        vector<int> f(n,1);//阶乘列表0!->n-1!
        for(int i=1;i<n;i++) f[i]=f[i-1]*i;//求阶乘
        --k;
        for(int i=n;i>=1;i--){
            int j=k/f[i-1];
            k%=f[i-1];
            res.push_back(num[j]);
            num.erase(j,1);
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_41394379/article/details/84837273
今日推荐