解题思路
找字典序的下一个数,通俗理解,以19为例,19下一个数是20,将十位扩大一点,各位变为最小。故可以从后往前找,后半部分递减,找到一个num[m + 1] >num[m],m+1到末尾相当于上面例子的个位,找到m+1到末尾比num[m]大的最小项,与num[m]交换,最后将m+1到末尾升序排列,相当于个位化为最小,十位变大了一点,从而得到字典序的下一个数。若找不到num[m + 1]>num[m],则将原数列升序排列,从而得到结果。
代码
class Solution {
public:
void nextPermutation(vector<int> &num) {
int i,m;
for(i = num.size() - 2;i >= 0;i--){
if(num[i + 1] > num[i])
break;
}
if(i < 0){
sort(num.begin(),num.end());
return;
}
m = i;
i++;
for(;i < num.size();i++){
if(num[i] <= num[m]){
i--;
break;
}
if(i == num.size() - 1)
break;
}
int tmp = num[i];
num[i] = num[m];
num[m] = tmp;
sort(num.begin() + (m + 1),num.end());
}
};