1. 题目
2. 算法
- stl
- 逆序
例如:1 4 6 5 3 2
step1:从右往左找到第一个破坏升序的元素,例如:4,标记为i;
step2:依次从右往左找第一个大于4的元素,例如:5,交换4和5
step3:从i+1到最右端,逆置。6432->2346
So,152346为所求
3. 代码
3.1 stl
class Solution{
public:
void nextPermutation(vector<int>& nums){
next_permutation(nums.begin(),nums.end());
}
};
逆序
class Solution{
public:
void nextPermutation(vector<int>& nums){
if(!nums.size())
return;
int idx=nums.size()-2;
// 找到第一个乱序s
while(idx>=0 && nums[idx]>=nums[idx+1])
idx--;
// 交换
if(idx>=0){
int i=idx+1;
while(i<nums.size()&& nums[i]>nums[idx])
i++;
swap(nums[i-1],nums[idx]);
}
//反转
reverse(nums.begin()+idx+1,nums.end());
}
};