Permutation Sequence

first time:列出所有排列,输出第K个   Time Limit Exceeded

class Solution {
public:
    void recursive(vector<vector<int>>&vec,vector<int> vec_t,int cur,int end,int k)
{
	if (cur>end)
	{
		vec.push_back(vec_t);
	}
	else
	{

		for (int i=cur;i<=end;i++)
		{
			swap(vec_t[i],vec_t[cur]);
			recursive(vec,vec_t,cur+1,end,k);
			swap(vec_t[i],vec_t[cur]);
		}
	}
}
    void findsequence(vector<vector<int>>&vec,int n,int k)
    {
        vector<int> vec_t;
	for (int i=1;i<=n;i++)
	{
		vec_t.push_back(i);
	}
	recursive(vec,vec_t,0,n-1,k);
    }
    
    string getPermutation(int n, int k) {
        vector<vector<int>> vec;
        string str;
        findsequence(vec,n,k);
        
        //size_t size=vec[k-1].size();
        vector<int> tem=vec.back();
	    int size=tem.size();
        for(int i=0;i<size;i++)
        {
            char ch=tem[i]+48;
            str+=ch;
        }
        return str;
    }
};

 second time:数值解法(lehmer码)

假设数组为[1,2,3,4],求第6个排列,分别计算各个位上lehmer码

第一位 5/3!=0余5,商为lehmer码,余数作为下一位lehmer码的被除数

第二位 5/2!=2余1

第三位 1/1!=1余0

第四位 0(最后一位总是0)

那么,第一个位置上,取数组的第0个即1,数组变为[2,3,4];

        第二个位置上,取数组的第2个即4,数组变为[2,3];

        第三个位置上,取数组的第1个即2,数组变为[3];

        第四个位置上,取数组的第0个即3;

那么组合即为1432;

class Solution {
public:
    string getPermutation(int n, int k) {
      	string str;
	list<int> list_t;
	int factorial=1;
	for(int i=1;i<=n;i++)
	{
		list_t.push_back(i);
		factorial*=i;
	}
	int lehmer=k-1,next_lehmer=0;
	list<int>::iterator ite;
	for(int i=0;i<n;i++)
	{
		ite=list_t.begin();
		factorial/=(n-i);
		int index=lehmer/factorial;
		for (int j=0;j<index;j++)
		{
			ite++;
		}
		char ch=*(ite)+48;
		str+=ch;
		list_t.erase(ite);
		lehmer%=factorial;
	}
	return str;
    }
};

 

posted @ 2015-04-08 20:15  zhanghui_dut  阅读(100)  评论(0)    收藏  举报