下一个排列
思路:从数组末尾开始找到一个比前一个大的数,该数下表为i,在从数组末尾重新遍历直到i找到第一个比i-1的大的数,将该数和i-1交换,并将数组(nums.begin()+i,nums.end())排序,即得到结果。如果数组一开始就是降序排列需要特判。
例如下图
1.找到第一个比前一个大的数是坐标3即途中i指向的4.
2.数组末尾重新遍历找到第一个比nums[i-1]大的数nums[j]
3.将nums[j]和nums[i-1]交换位置
4.排序i-1后面的元素,sort(nums.begin()+i,nums.end())
代码如下:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
for(int i=nums.size()-1;i>=0;i--){
//特判
if(i==0){
reverse(nums.begin(),nums.end());
return;
}
if(nums[i]>nums[i-1]){
for(int j=nums.size()-1;j>=i;j--){
//从后往前找比nums[i-1]大的数
if(nums[j]>nums[i-1]){
//交换nums[i-1]和nums[j]
int temp = nums[j];
nums[j] = nums[i-1];
nums[i-1] = temp;
//排序i-1后面的元素
sort(nums.begin()+i,nums.end());
return;
}
}
}
}
return;
}
};