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]
.
class Solution {
public:
void heapKeep(vector<int> &num,int i,int len){
int max=i;
int le = 2*i;
int ri = 2*i+1;
if (le<len && num[le]>num[max])
max = le;
if (ri<len && num[ri]>num[max])
max = ri;
if (max != i) {
swap(num[i],num[max]);
heapKeep(num,max,len);
}
}
void heapBuild(vector<int> &num){
int len = num.size();
for (int i=len/2; i>=0; --i){
heapKeep(num,i,len);
}
}
void heapSort(vector<int> &num){
int len = num.size();
heapBuild(num);
for (int i=len-1; i>0; --i){
swap(num[0],num[i]);
heapKeep(num,0,i);
}
}
void reserveVec(vector<int> &num,int begin,int end){
while (begin<end) {
swap (num[begin++],num[end--]);
}
}
vector<vector<int> > permute(vector<int> &num) {
//从小到大
int len = num.size();
vector<vector<int>> vec;
if (len==0) return vec;
heapSort(num);
while (true) {
int index =len -1;
int littlebig = index;
vec.push_back(num);
while (index>=1 && num[index-1]>num[index]) {
index--;
}
if (index==0) return vec;
while (num[littlebig]<=num[index-1]){
littlebig--;
}
swap(num[littlebig],num[index-1]);
reserveVec(num,index,len-1);
}
return vec;
}
};