-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPermutation_Sequence.cpp
82 lines (70 loc) · 1.49 KB
/
Permutation_Sequence.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <cmath>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <numeric>
#include <algorithm>
using namespace std;
void print_2d_vector(vector<vector<int> >x){
for(int i=0;i<x.size();i++){
for(int j=0;j<x[i].size();j++)
cout << x[i][j] << " ";
cout << "\n";
}
}
void print_vector(vector<int> x){
for(int i=0;i<x.size();i++){
cout << x[i] << " ";
}
cout << endl;
}
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> v(n);
iota(v.begin(), v.end(), 1);
string s;
print_vector(v);
while(v.size()>0){
s += int2str(get_digit(v, k));
}
return s;
}
string int2str(int t){
stringstream ss;
string s;
ss << t;
ss >> s;
return s;
}
int get_digit(vector<int>& v, int& k){
int len = v.size();
if(len == 1){
int value = v[0];
v.erase(v.begin()+0);
return value;
}
int p = get_permutation_num(len-1);
int index = int(ceil(k * 1.0 / p));
int value = v[index-1];
cout << "vector is:";
print_vector(v);
//cout << "p:" << p << " k:" << k << " index :" << index << endl;
v.erase(v.begin() + index - 1);
k = k - (index-1)*p;
return value;
}
int get_permutation_num(int n){
int r=1;
for(int i=1;i<n+1;i++){
r *= i;
}
return r;
}
};
int main(){
Solution s = Solution();
//s.getPermutation(3,3);
cout << s.getPermutation(4,1);
}