मान लीजिए कि सेट [1,2,3,...,n] जैसा है, जिसमें कुल n है! अद्वितीय क्रमपरिवर्तन। क्रम में सभी क्रमपरिवर्तनों को सूचीबद्ध और लेबल करके, हमें n =3 के लिए ये क्रम मिलते हैं:["123", "132", "213", "231", "312", "321"] तो यदि n और k दिए गए हैं, फिर kth क्रमपरिवर्तन अनुक्रम लौटाएं। n 1 से 9 (समावेशी) के बीच होगा और k 1 से n के बीच होगा! (सहित)। उदाहरण के लिए यदि n =3.
आइए चरणों को देखें -
- Ans :=खाली स्ट्रिंग, आकार n के उम्मीदवार कहे जाने वाले सरणी को परिभाषित करें
- मैं के लिए 0 से n - 1 की सीमा में
- उम्मीदवार[i] :=((i + 1) + वर्ण '0')
- फ़ैक्ट ऑफ़ साइज़ n + 1 नामक एक ऐरे बनाएं, फ़ैक्ट सेट करें[0] :=1
- मैं के लिए 1 से n की सीमा में
- तथ्य[i] :=तथ्य[i - 1] * i
- k को 1 से घटाएं
- i के लिए :=n - 1 से 0 तक
- idx :=k / fact[i]
- उत्तर:=उत्तर + उम्मीदवार[idx]
- j के लिए:=idx, j + 1 <उम्मीदवारों का आकार
- उम्मीदवार[j]:=उम्मीदवार[j + 1]
- k:=k आधुनिक तथ्य[i]
- वापसी उत्तर
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
string getPermutation(int n, int k) {
string ans = "";
vector <char> candidates(n);
for(lli i = 0; i < n; i++)
candidates[i] = ((i + 1) + '0');
vector <lli> fact(n + 1);
fact[0] = 1;
for(lli i = 1; i <= n; i++)
fact[i] = fact[i - 1] * i;
k--;
for(lli i = n - 1; i >= 0; i--){
lli idx = k / fact[i];
ans += candidates[idx];
for(lli j = idx; j + 1< candidates.size(); j++)
candidates[j] = candidates[j + 1];
k = k % fact[i];
}
return ans;
}
};
main(){
Solution ob;
cout << ob.getPermutation(4, 9);
} इनपुट
4 9
आउटपुट
2314