原题链接:Leecode 31. 下一个排列
题解:下一个排列算法详解:思路+推导+步骤,看不懂算我输!
算法思路:
1.从后向前查找第一个相邻升序的元素对 (i,j)
,满足 A[i] < A[j]
。此时 [j,end)
必然是降序
2.在 [j,end)
从后向前查找第一个满足 A[i] < A[k]
的 k
。
3.将 A[i]
与 A[k]
交换
4.可以断定这时 [j,end)
必然是降序,逆置 [j,end)
,使其升序
5.如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end)
为一个降序顺序,则直接跳到步骤
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size();
if(n <= 1) return;
int i=n-2,j=n-1,k=n-1;
while(i>=0 && nums[i]>=nums[j])
{
i--;j--;
}
if(i>=0)
{
while(nums[i]>=nums[k])
k--;
swap(nums[i],nums[k]);
}
sort(nums.begin()+j,nums.end());
}
};