Skip to content

Commit

Permalink
46 & 47 Permutations
Browse files Browse the repository at this point in the history
  • Loading branch information
int32bit committed Apr 12, 2015
1 parent 73697cc commit 29de186
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 1 deletion.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
+ [7 Reverse Integer(溢出检测)](algorithms/ReverseInteger)
+ [8 String to Integer (atoi)(溢出检测)](algorithms/StringtoInteger)
+ [21 Merge Two Sorted Lists](algorithms/MergeTwoSortedLists)
+ [31 Next Permutation](algorithms/NextPermutation)
+ [31 Next Permutation(全排列)](algorithms/NextPermutation)
+ [46 Permutations(全排列)](algorithms/Permutations)
+ [47 Permutations II(全排列)](algorithms/Permutations2)
+ [60 Permutation Sequence(康托展开)](algorithms/PermutationSequence)
+ [65 Valid Number(细节题,状态机)](algorithms/ValidNumber)
+ [191 Number of 1 Bits(位运算)](algorithms/Numberof1Bits)
Expand Down
43 changes: 43 additions & 0 deletions algorithms/Permutations/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
## Permutations

Given a collection of numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].

## Solution

全排列, [从一个排列求下一个排列算法](https://github.com/krystism/algorithms/tree/master/permutation)

## Code
```cpp
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int>> ans;
sort(num.begin(), num.end());
do {
vector<int> v(num.begin(), num.end());
ans.push_back(v);
} while(next(num));
return ans;
}
private:
bool next(vector<int> &v) {
size_t n = v.size();
int i;
for (i = n - 2; i >= 0 && v[i] >= v[i + 1]; --i);
if (i < 0) {
reverse(v.begin(), v.end());
return false;
}
int j;
for (j = n - 1; j > i && v[j] <= v[i]; --j);
swap(v[i], v[j]);
reverse(v.begin() + i + 1, v.end());
return true;
}

};
```
48 changes: 48 additions & 0 deletions algorithms/Permutations/permutations.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;
void print(vector<int> v)
{
for (auto i : v)
printf("%d ", i);
printf("\n");
}
class Solution {
public:
vector<vector<int> > permute(vector<int> &num) {
vector<vector<int>> ans;
sort(num.begin(), num.end());
do {
vector<int> v(num.begin(), num.end());
ans.push_back(v);
} while(next(num));
return ans;
}
private:
bool next(vector<int> &v) {
size_t n = v.size();
int i;
for (i = n - 2; i >= 0 && v[i] >= v[i + 1]; --i);
if (i < 0) {
reverse(v.begin(), v.end());
return false;
}
int j;
for (j = n - 1; j > i && v[j] <= v[i]; --j);
swap(v[i], v[j]);
reverse(v.begin() + i + 1, v.end());
return true;
}

};
int main(int argc, char **argv)
{
Solution solution;
vector<int> num = {1,2,3, 4, 5};
vector<vector<int>> ans = solution.permute(num);
for (auto i : ans)
print(i);
return 0;
}
43 changes: 43 additions & 0 deletions algorithms/Permutations2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
## Permutations II

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
`[1,1,2]` have the following unique permutations:
`[1,1,2]`, `[1,2,1]`, and `[2,1,1]`.

## Solution

全排列, [从一个排列求下一个排列算法](https://github.com/krystism/algorithms/tree/master/permutation)

## Code
```cpp
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> ans;
sort(num.begin(), num.end());
do {
vector<int> v(num.begin(), num.end());
ans.push_back(v);
} while(next(num));
return ans;
}
private:
bool next(vector<int> &v) {
size_t n = v.size();
int i;
for (i = n - 2; i >= 0 && v[i] >= v[i + 1]; --i);
if (i < 0) {
reverse(v.begin(), v.end());
return false;
}
int j;
for (j = n - 1; j > i && v[j] <= v[i]; --j);
swap(v[i], v[j]);
reverse(v.begin() + i + 1, v.end());
return true;
}

};
```

0 comments on commit 29de186

Please sign in to comment.