• Permutation Sequence


    class Solution {
    public:
    	int num=0;
    	bool isgo=true;
    public:
        string getPermutation(int n, int k) {
            vector<int> nums;
            for(int i=1;i<=n;++i)
                nums.push_back(i);
            vector<vector<int>> res;
            vector<int> path;
            string str;
            trackback(res,path,nums,k,str);
            
            return str;
        }
        void trackback(vector<vector<int>> &res,vector<int> &path,vector<int> &nums,int k,string &str)
        {
            if(path.size() == nums.size())
            {
                res.push_back(path);
                num++;
                if(num == k)
                {
           			 for(auto c:path)
            		{
               			 str+=char(c+48);
            		}
            		isgo=false;
    			}
                return ;
            }
            if(!isgo)//强制递归停止,层层返回
            	return ;
            for(auto i:nums)
            {
                auto pos=find(path.begin(),path.end(),i);
                if(pos==path.end())
                {
                    path.push_back(i);
                    trackback(res,path,nums,k,str);
                    path.pop_back();
                }
            }
        }
    };
    

    但是这个方法超时

    康托逆展开编辑

    例1 {1,2,3,4,5}的全排列,并且已经从小到大排序完毕
    (1)找出第96个数
    首先用96-1得到95
    用95去除4! 得到3余23
    有3个数比它小的数是4
    所以第一位是4
    用23去除3! 得到3余5
    有3个数比它小的数是4但4已经在之前出现过了所以第二位是5(4在之前出现过,所以实际比5小的数是3个)
    用5去除2!得到2余1
    有2个数比它小的数是3,第三位是3
    用1去除1!得到1余0
    有1个数比它小的数是2,第二位是2
    最后一个数只能是1
    所以这个数是45321
    class Solution {
        public:
            string getPermutation(int n, int k) {
                int tbl[]= { 1,2,6,24,120,720,5040,40320,362880 };
                if( k > tbl[n-1] ) return "";
                vector<int> used { 1,2,3,4,5,6,7,8,9 };
                string s(n, '0');
                int i=n-1, j=0, o, u;
                while( j < n ) {
                    o = ( i == 0 ? 0 : (k-1)/tbl[i-1]);
                    u = used[o];
                    s[j++] = u + '0';
                    used.erase(used.begin() + o);
                    k = k - o*tbl[(i--)-1];
                }
                return s;
            }
    };
    

      看了这个高手的代码,真的是心情愉悦,还有更精简的吗?

  • 相关阅读:
    JS 禁止刷新和右键
    报错 避免重复
    CSS 总结
    CSS BUG 总结
    安装 mrtg
    人人网 网站接入总结
    PHPcms 把盛大登陆换成人人网登陆
    HTML 相同name 传递一个数组
    file_get_contents无法请求https连接的解决方法
    现货黄金白银上阻力位和压力位的确定和应用
  • 原文地址:https://www.cnblogs.com/yanqi110/p/4933074.html
Copyright © 2020-2023  润新知