The set [1,2,3,…,n] contains a total of n! unique permutations.
"123""132""213""231""312""321"
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
分析:
可以一个一个找next permulation 不过会超时
class Solution { private: void getBigger(vector
&numbers){ int pos = numbers.size() - 1; while(numbers[pos - 1] > numbers[pos]) pos--; pos--; int xpos = numbers.size() - 1; while(numbers[xpos] < numbers[pos]) xpos--; int x = numbers[xpos]; int t = numbers[pos]; numbers[pos] = numbers[xpos]; numbers[xpos] = t; int i = pos + 1, j = numbers.size() - 1; while(i < j){ t = numbers[i]; numbers[i] = numbers[j]; numbers[j] = t; i ++; j --; } } public: string getPermutation(int n, int k) { vector
numbers(n); for(int i = 1; i <= n; i++){ numbers[i - 1] = i; } for(int i = 1; i < k; i++) getBigger(numbers);//,printVector
(numbers); string ans; for(auto x : numbers){ char ch[25]; sprintf(ch,"%d",x); ans += string(ch); } return ans; } };
还可以直接算出来,比如5的排列中,前4! 个排列一定是1开头的,第二个4! 排列中一定是2开头的,依此类推。
class Solution { private: int getJieCheng(int m){ int ans = 1; for(int i = 1; i <= m;i ++){ ans *= i; } return ans; } public: string getPermutation(int n, int k) { vector
numbers; for(int i = 1; i <= n; i++) numbers.push_back(i); string ans; for(int m = n - 1; m >= 0; m--){ int l = getJieCheng(m); int i = 0; while(k > l){ k -= l; i++; } char ch[10]; sprintf(ch, "%d", numbers[i]); ans += string(ch); numbers.erase(numbers.begin() + i); } return ans; } };
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229033.html原文链接:https://javaforall.net
