找到需要修改的最低位排列,如果一个低位排列是单调非增的,那么无法将它变得更大,因此从尾部开始扫描,找到的第一个不是单调非增的低位排列就是我们需要修改的数
a
[
i
]
a[i]
a[i]
在修改时,我们应该利用在上一次找到的单调非增排列
a
[
i
+
1
:
]
a[i+1:]
a[i+1:]中选择恰好大于
a
[
i
]
a[i]
a[i]的数去交换
a
[
i
]
a[i]
a[i],交换后
a
[
i
+
1
:
]
a[i+1:]
a[i+1:]应当变为最小排列,注意此时
a
[
i
+
1
:
]
a[i+1:]
a[i+1:]依然是一个单调非增排列,不用排序直接首尾交换即可得到单调非减排列,此时便完成了下一个排列。
code(需要剔除一些例外情况):
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int previous_max = -1;
int n = nums.size();
if(n<=1)
return;
int i=n-1;
for(;i>=0;i--){
if(nums[i]<previous_max)
break;
previous_max = nums[i];
}
if(i<0){
int left =0, right = n-1;
while(right>left){
int tmp = nums[right];
nums[right--] = nums[left];
nums[left++] = tmp;
}
return;
}
int j = i+1;
for(j=i+1;j<n;j++){
if(nums[j]<=nums[i])
break;
}
int tmp = nums[i];
nums[i] = nums[j-1];
nums[j-1] = tmp;
int left =i+1, right = n-1;
while(right>left){
int tmp = nums[right];
nums[right--] = nums[left];
nums[left++] = tmp;
}
}
};