(每日一练c++)CC119 下一个排列

描述

实现函数next permutation(下一个排列):将排列中的数字重新排列成字典序中的下一个更大的排列。将排列中的数字重新排列成字典序中的下一个更大的排列。

如果不存在这样的排列,则将其排列为字典序最小的排列(升序排列)

需要使用原地算法来解决这个问题,不能申请额外的内存空间

下面有机组样例,左边是输入的数据,右边是输出的答案

1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1

class Solution {
public:
    void nextPermutation(vector<int> &num) {
        if(num.empty())
            return;
        int n=num.size();
        int i=n-1;
        while(i>=1){
            if(num[i]>num[i-1]){
                
                break;
            }
            i--;
        }
        if(i<1){
            int begin=0,end=n-1;
            while(begin<end){
                int tmp=num[begin];
                num[begin]=num[end];
                num[end]=tmp;
                begin++;
                end--;
            }
        }
        else{
            int begin=i,end=n-1;
            while(begin<end){
                int tmp=num[begin];
                num[begin]=num[end];
                num[end]=tmp;
                begin++;
                end--;
            }
            int j=i;
            while(j<n&&num[j]<=num[i-1])
                j++;
            int tmp=num[i-1];
            num[i-1]=num[j];
            num[j]=tmp;
        }
    }
};

思路:
首先从后前查找第一个满足i-1<i的位置i,如果找不到,说明这个排列是降序的,那么返回所有数的顺序排列;
否则,说明i及以后的排列是降序的,首先将该部分置换为升序的,然后从中找比i-1位置处的值大的最小的那个数,
然后将i-1位置处的数与找到的数进行交换即可。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值