思路:
在当前数组之中,从最后一个数开始向前遍历,找到第一对满足nums[i]<num[i+1] 的数,那么nums[i]就是需要调整的,例如:
1,3,2的下一个按照字典顺的排列是2,1,3 ,那么1这个数字就是需要调整位置的
定位出nums[i]之后,因为从i+1开始,后面的数组是降序排列的,则从位置i开始,向后寻找第一个比nums[i]大的数nums[j],交换nums[i]和nums[j]的位置
最后,将nums[i]之后的数组全部逆置,就得到了下一个序列
代码如下:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i = nums.size() - 2;
while (i >= 0 && nums[i + 1] <= nums[i]) {
i--;
}
if (i >= 0) {
int j = nums.size() - 1;
while (j >= 0 && nums[j] <= nums[i]) {
j--;
}
swap(nums, i, j);
}
reverse(nums,i+1);
}
void reverse(vector<int>& nums,int start){
int i = start, j = nums.size() - 1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
void swap(vector<int>& nums,int left,int right){
int tmp = nums[left];
nums[left]=nums[right];
nums[right]=tmp;
}
};