Skip to content

Commit 5ea1863

Browse files
committed
Solution for permutation related questions
1 parent 272660f commit 5ea1863

File tree

4 files changed

+138
-0
lines changed

4 files changed

+138
-0
lines changed

Next_Permutation.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class Solution {
2+
public:
3+
void nextPermutation(vector<int> &num) {
4+
5+
int k = find_break(num);
6+
7+
if(k == -1){
8+
sort(num.begin(), num.end());
9+
}else{
10+
sort(num.begin()+k+1, num.end());
11+
12+
for(int i = k+1; i < num.size(); i++){
13+
if(num[i] > num[k]){
14+
swap(num[k], num[i]);
15+
break;
16+
}
17+
}
18+
}
19+
}
20+
21+
private:
22+
int find_break(vector<int> &A){
23+
if(A.size() < 2) return -1;
24+
25+
for(int i = A.size()-1; i>0; i--){
26+
if(A[i] > A[i-1]) return i-1;
27+
}
28+
29+
return -1;
30+
}
31+
};

Permutation_Sequence.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class Solution {
2+
public:
3+
string getPermutation(int n, int k) {
4+
vector<int> elems;
5+
for(int i = 1; i <= n; i++){
6+
elems.push_back(i);
7+
}
8+
9+
return perm_helper(elems, k);
10+
}
11+
private:
12+
int fac(int i){
13+
if(i == 1) return 1;
14+
int result = 1;
15+
while(i > 1){
16+
result *= i;
17+
i--;
18+
}
19+
return result;
20+
}
21+
22+
string perm_helper(vector<int> &A, int k){
23+
string result;
24+
25+
if(k == 1){
26+
for(int i = 0; i < A.size(); i++){
27+
result += (char)(A[i] + '0');
28+
}
29+
return result;
30+
}
31+
32+
int range = fac(A.size()-1);
33+
int ind = (k-1)/range;
34+
35+
int new_rank = k%range;
36+
if(new_rank == 0) new_rank += range;
37+
38+
result += (char)(A[ind]+'0');
39+
A.erase(A.begin()+ind);
40+
41+
result += perm_helper(A, new_rank);
42+
return result;
43+
}
44+
};

Permutations.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution {
2+
public:
3+
vector<vector<int> > permute(vector<int> &num) {
4+
if(num.empty()) return vector<vector<int>>();
5+
vector<vector<int>> result;
6+
7+
vector<int> sofar;
8+
vector<int> rest;
9+
permute_helper(result, sofar, num);
10+
11+
return result;
12+
}
13+
14+
private:
15+
void permute_helper(vector<vector<int>> &result, vector<int> &sofar, vector<int> &rest){
16+
if(rest.empty()){
17+
result.push_back(sofar);
18+
return;
19+
}
20+
21+
for(int i = 0; i < rest.size(); i++){
22+
int t = rest[i];
23+
sofar.push_back(t);
24+
auto it = rest.erase(rest.begin()+i);
25+
permute_helper(result, sofar, rest);
26+
sofar.pop_back();
27+
rest.insert(it, t);
28+
}
29+
}
30+
};

Permutations_2.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
class Solution {
2+
public:
3+
vector<vector<int> > permuteUnique(vector<int> &num) {
4+
if(num.empty()) return vector<vector<int>>();
5+
sort(num.begin(), num.end());
6+
7+
vector<vector<int>> result;
8+
vector<int> sofar;
9+
permute_helper(result, sofar, num);
10+
11+
return result;
12+
}
13+
private:
14+
void permute_helper(vector<vector<int>> &result, vector<int> &sofar, vector<int> &rest){
15+
if(rest.empty()){
16+
result.push_back(sofar);
17+
return;
18+
}
19+
20+
for(int i = 0; i < rest.size(); i++){
21+
if(i > 0 && rest[i] == rest[i-1]) continue;
22+
int t = rest[i];
23+
24+
sofar.push_back(t);
25+
auto it = rest.erase(rest.begin()+i);
26+
27+
permute_helper(result, sofar, rest);
28+
29+
sofar.pop_back();
30+
rest.insert(it, t);
31+
}
32+
}
33+
};

0 commit comments

Comments
 (0)