基本思路:
- 从数组最后开始向前找出,使得前一个数小于本身的第一个数,下标记为r;(若r=0即不存在下一个更大的排列,则将数字重新排列成最小的排列。)
- 然后从r开始向后下标r以后大于小标r-1的最小的数,下标记为k;
- 交换下标为r-1和k,的两个数,
- 将包括下标r的数组后面的 数反转(即从小到大排列)。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int len=nums.size();
int r=len-1;
while(r!=0&&nums[r-1]>=nums[r])r--;
if(r)
{
int k=r;
while(k<len-1&&nums[k+1]>nums[r-1])++k;
swap(nums[r-1],nums[k]);
}
reverse(nums.begin()+r,nums.end());
}
};