leetcode 60. 第k個排列(C++超超詳細,易理解)

給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。

按大小順序列出所有排列情況,並一一標記,當 n = 3 時, 所有排列如下:

“123”
“132”
“213”
“231”
“312”
“321”
給定 n 和 k,返回第 k 個排列。

說明:

給定 n 的範圍是 [1, 9]。
給定 k 的範圍是[1, n!]。
示例 1:

輸入: n = 3, k = 3
輸出: “213”
示例 2:

輸入: n = 4, k = 9
輸出: “2314”

	class Solution {
	     /**
	        直接用回溯法做的話需要在回溯到第k個排列時終止就不會超時了, 但是效率依舊感人
	        可以用數學的方法來解, 因爲數字都是從1開始的連續自然數, 排列出現的次序可以推
	        算出來, 對於n=4, k=15 找到k=15排列的過程:
	        
	        1 + 對2,3,4的全排列 (3!個)         
        2 + 對1,3,4的全排列 (3!個)         3, 1 + 對2,4的全排列(2!個)
        3 + 對1,2,4的全排列 (3!個)-------> 3, 2 + 對1,4的全排列(2!個)-------> 3, 2, 1 + 對4的全排列(1!個)-------> 3214
        4 + 對1,2,3的全排列 (3!個)         3, 4 + 對1,2的全排列(2!個)         3, 2, 4 + 對1的全排列(1!個)
        
        確定第一位:
            k = 14(從0開始計數)
            index = k / (n-1)! = 2, 說明第15個數的第一位是3 
            更新k
            k = k - index*(n-1)! = 2
        確定第二位:
            k = 2
            index = k / (n-2)! = 1, 說明第15個數的第二位是2
            更新k
            k = k - index*(n-2)! = 0
        確定第三位:
            k = 0
            index = k / (n-3)! = 0, 說明第15個數的第三位是1
            更新k
            k = k - index*(n-3)! = 0
        確定第四位:
            k = 0
            index = k / (n-4)! = 0, 說明第15個數的第四位是4
        最終確定n=4時第15個數爲3214 
        **/


public:
    int factorial(int n)
    {
        
        int b=1;
        for(int i=1;i<=n;i++)
            b=b*i;
        return b;   

    }
    string getPermutation(int n, int k)
    {

        string ans;
        string s;//也可以 string s="";
        int num=factorial(n);
        for(int i=0;i<n;i++)
            s+=i+'1';//字符相加 
            //s=s+i+'1'
        for(int i=n;i>0;i--)
        {
           num=num/i;
           int index=(k-1)/num;
           ans=ans+s[index];
           k=k-index*num;
           s.erase(index,1);

        }
        return ans;
  
    }
};

1.注意s+=和s=s+的區別,前者能實現類型的自動轉換。後者先是轉變類型,再賦值給s類型,前後類型必須相同,否者編譯不通過。
2.string s;//也可以 string s="";但是不能表示string s=null,該句表示未申請任何內存資源,即些語句表示聲明瞭一個引用變量並初始化引用,但是該引用沒有指向任何對象.但可以把它作爲參數傳遞或其它使用,但是不能調用它作爲對象的方法。string具體用法見下一章內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章