思路展示
下一个排列
的定义是:给定数字序列的字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
示例代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int len=nums.size();
//第一步:从后向前 查找第一个 相邻升序 的元素对 (i,j),满足 A[i] < A[j],此时 [j,end) 必然是降序
for(int i=len-2;i>=0;i--){
if(nums[i]<nums[i+1]){
//第二步:在 [j,end) 从后向前 查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
for(int j=len-1;j>i;j--){
if(nums[j]>nums[i]){
//第三步:将 A[i] 与 A[k] 交换
swap(nums[j],nums[i]);
//第四步:可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
reverse(nums.begin()+i+1,nums.end());
return;
}
}
}
}
//如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4
reverse(nums.begin(),nums.end());
}
};
效果展示