31. 下一个排列
中文版本链接 link
![截图](https://img-blog.csdnimg.cn/20201111210549985.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODgzNTIz,size_16,color_FFFFFF,t_70#pic_center)
思路:
1.首先从右向左遍历列表,找到第一个下降的点即nums[i] < nums[i+1],这个i就是需要替换的位置。
2.将i之后的点即[i+1, nums.size()-1]这个区间里的数倒序排列
3.在[i+1, nums.size()-1]这个区间里找到大于nums[i]且最接近num[i]的点,交换位置。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() <= 0)return;
for (int i = nums.size() - 2; i >= 0; --i)
{
if (nums[i] < nums[i+1])
{
auto pos = i + 1;
auto j = nums.size() - 1;
while (pos < j)swap(nums[pos++], nums[j--]);
pos = i + 1;
while (pos < nums.size() && nums[i] >= nums[pos])pos++;
swap(nums[i], nums[pos]);
return;
}
}
int i = 0, j = nums.size() - 1;
while (i < j)swap(nums[i++], nums[j--]);
}
};