मान लीजिए कि सेट [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