stl的实现方法,先从后往前找一个相邻的第一个小于第二个的数对,然后从后往前找第一个大于上述数对第一个数字的数,交换两者,逆序数对第二个数到最后的所有数字
class Solution {
public:
void nextPermutation(vector<int> &num) {
if( num.size() <= 1)
return;
int i = num.size() - 1;
while(true){
int ii = i;
--i;
if( num[i] < num[ii]){
int j = num.size();
while( !(num[i] < num[--j])){}
swap( num, i, j);
reverse( num, ii);
return;
}
if( i == 0){
reverse( num, i);
return;
}
}
}
void swap( vector< int> &num, int i, int j){
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
void reverse( vector< int> &num, int i){
for( int j = i, k = num.size()-1; j < k; ++j, --k){
swap( num, j, k);
}
}
};