zoukankan      html  css  js  c++  java
  • leetcode 60. Permutation Sequence

    首先暴力解法,求出所以的排列, 排序,求第k个

    class Solution {
    public:
        
        void getP(vector<int> num, vector<string> & result, string s)
        {
            if(num.empty())
            {
                result.push_back(s);
                return ;
            }
                
            int t;
            for(int i=0;i<num.size();i++)
            {
                t=num[i];
                num.erase(num.begin()+i);
                getP(num, result, s+to_string(t));
             
                num.insert(num.begin()+i,t);
               
            }
        }
        string getPermutation(int n, int k) {
            vector<int> num;
            for(int i=1;i<=n;i++)
            {
                num.push_back(i);
            }
            vector<string> result;
            string temp;
            getP(num,result,temp);
          
            sort(result.begin(),result.end());
            return result[k-1];
        }
    };
    

      超时。。。

    考虑数学归纳法:

    n个数有n!个排列组合.  

        string getPermutation(int n, int k) {
            /*
            vector<int> num;
            for(int i=1;i<=n;i++)
            {
                num.push_back(i);
            }
            vector<string> result;
            string temp;
            getP(num,result,temp);
          
            sort(result.begin(),result.end());
            return result[k-1];
            */
             
             vector<int> factorial = vector<int>(n + 1, 1);
            for (int i = 1; i < n + 1; ++i) {
                factorial[i] = factorial[i - 1] * i;
            }
            vector<int> nums;
            for (int i = 1; i < n + 1; ++i) {
                nums.push_back(i);
            }
            
           vector<int> perm;
            for (int i = 0; i < n; ++i) {
                int rank = (k - 1) / factorial[n - i - 1];
                k = (k - 1) % factorial[n - i - 1] + 1;
                // append and remove nums[rank]
                perm.push_back(nums[rank]);
                nums.erase(std::remove(nums.begin(), nums.end(), nums[rank]), nums.end());
            }
            // transform a vector<int> to a string
            std::stringstream result;
            std::copy(perm.begin(), perm.end(), std::ostream_iterator<int>(result, ""));
    
            return result.str();
        
        }
    };
  • 相关阅读:
    jquery更改输入框type为密码框password
    用table做网页,设置了border为1px怎么还是觉得很粗?
    键盘按钮keyCode大全
    兼容firefox的 keyCode
    php生成随机字符串和验证码的类
    asp.net多图片上传实现程序代码
    asp.net图片上传实例
    纯js分页代码(简洁实用)
    jQuery中读取json文件示例代码
    perl编程中的map函数示例
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7354654.html
Copyright © 2011-2022 走看看