leetcode.31—Next Permutation

本文详细解析了如何寻找一个整数序列的下一个全排列。通过具体示例介绍算法步骤,并提供C++实现代码,包括使用STL的reverse函数进行序列反转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题大意就是求下一个比原排列大的全排列。例如:1,2,3有6种排列方式(按从小到大的顺序){(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)}根据这个表,123的下一个全排列是132

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

1,1,5 → 1,5,1

本题思路就是从后往前找,直到找到一个元素b,比它的前一个元素要大(我们把它的前一个元素记a)。然后将a与a以后比a大的最小元素替换。替换后,从b以后的这个序列一定是一个降序序列,可以用反证法来证明(在此证明略),之后只需反向保存就可以。

另外别忘了题目中要求,如果不存在下一个全排列的情况:这时候说明此排列已经是最大排列,直接是一个降序序列,所以直接反向输出即可。

这里要用到STL的反转函数reverse:reverse
要知道的是它的参数是两个迭代器

详见AC代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        bool flag=0;
        for(int i=nums.size()-1;i>0;i--){
            if(nums[i]>nums[i-1]){
                flag=1;
                int min=nums[i],path=i;
                for(int j=i;j<nums.size();j++){
                    if(nums[j]<=min&&nums[j]>nums[i-1]){
                        min=nums[j];
                        path=j;
                    }
                }
            swap(nums[i-1],nums[path]);
               // cout<<nums[i-1]<<endl;
               //for(int j=0;j<(nums.size()-i)/2;j++){
                reverse(nums.begin()+i,nums.end());  
                   // swap(nums[i+j],nums[nums.size()-1-j]);
                //}
                break;
            }
        }
        if(!flag){
                reverse(nums.begin(), nums.end());  
            }
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值