思路展示

下一个排列 的定义是:给定数字序列的字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

LeetCode---31. 下一个排列_示例代码


LeetCode---31. 下一个排列_职场和发展_02

示例代码

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());
    }
};

效果展示

LeetCode---31. 下一个排列_示例代码_03