Leetcode31. 下一个排列(C++思路与代码)

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。

示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]

思路:
leetcode上非常好的思路。
1.首先从尾部查找,直到找到当前元素大于前一个元素为止,记录该位置;
对于[5,6,11,9,7,5,3,1],即查找到11>6,此时位置索引为2;
2.从该位置到数组尾部的子序列中,找到一个比前一位置的大且最接近的数;
对于[5,6,11,9,7,5,3,1],即在[11,9,7,5,3,1]找到7,7是比6大且最接近6的,从尾部开始遍历,遍历到大于6的索引即可;
3.将找到的数与前一位置的数交换;
对于[5,6,11,9,7,5,3,1],交换后变为[5,7,11,9,6,5,3,1];
4.将该位置到数组尾部的子序列进行升序排列,因为已经为降序,故首尾两两交换即可;
对于步骤3中的[5,7,11,9,6,5,3,1],交换后为[5,7,1,3,5,6,9,11];
注意:对于最大的排列,从小到大排列即可。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int index=nums.size()-1;
        while(index>0&&nums[index]<=nums[index-1]){
            index--;
        }
        if(index==0){
            reverse(nums.begin(),nums.end());
        }
        else{
            int i=nums.size()-1;
            while(i>index&&nums[i]<=nums[index-1]){
                i--;
            }
            swap(nums[index-1],nums[i]);
            sort(nums.begin()+index,nums.end());
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值