描述
实现函数next permutation(下一个排列):将排列中的数字重新排列成字典序中的下一个更大的排列。将排列中的数字重新排列成字典序中的下一个更大的排列。
如果不存在这样的排列,则将其排列为字典序最小的排列(升序排列)
需要使用原地算法来解决这个问题,不能申请额外的内存空间
下面有机组样例,左边是输入的数据,右边是输出的答案
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1
class Solution {
public:
void nextPermutation(vector<int> &num) {
if(num.empty())
return;
int n=num.size();
int i=n-1;
while(i>=1){
if(num[i]>num[i-1]){
break;
}
i--;
}
if(i<1){
int begin=0,end=n-1;
while(begin<end){
int tmp=num[begin];
num[begin]=num[end];
num[end]=tmp;
begin++;
end--;
}
}
else{
int begin=i,end=n-1;
while(begin<end){
int tmp=num[begin];
num[begin]=num[end];
num[end]=tmp;
begin++;
end--;
}
int j=i;
while(j<n&&num[j]<=num[i-1])
j++;
int tmp=num[i-1];
num[i-1]=num[j];
num[j]=tmp;
}
}
};
思路:
首先从后前查找第一个满足i-1<i的位置i,如果找不到,说明这个排列是降序的,那么返回所有数的顺序排列;
否则,说明i及以后的排列是降序的,首先将该部分置换为升序的,然后从中找比i-1位置处的值大的最小的那个数,
然后将i-1位置处的数与找到的数进行交换即可。