(Leetcode) 31. Next Permutation

前言:萌新刷题ing…
-------------------正文分割线-----------------------------
在这里插入图片描述
lexicographically:字典序

解:
可以认为是一个串或数字的排序问题,即找出这个数组排序出的所有数中,刚好比当前数大的那个数。
例如,输入“1,2,3” ,可以组成6个数,分别为
123,132,213,231,312,321
根据题目所得,输出的应该是“1,3,2”

同理,如果输入的是“1,3,2”,输出应该是“2,1,3”
输入的是“3,2,1”,输出应该是“1,2,3”

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        // 长度为0或1的情况
        if(nums.size() == 0 || nums.size() == 1) 
            return;

        // 检查目前的序列有没有找到下一个(升序)序列的可能,即找 右>左 nums[i]>nums[i-1]
        // 从右向左开始找,看看有没有左边的数比右边大的情况
        int v1 = nums.size() - 1; 
        while(v1 >= 1 && nums[v1-1] >= nums[v1]){
            --v1;
        }

        // 如果没找到,则把序列反转即为所求
        // 例如: 98765 -> 56789
        if(v1 == 0){
            for(int i = 0; i < nums.size()/2; ++i){
                swap(nums[i], nums[nums.size() - 1 - i]);
            }
            return ;
        }

        // 有下一个序列,则求之,此时v1等于第一次nums[i-1] < nums[i]的中的i
        int v2 = nums.size() - 1;

        // 从右向左,找到第一个比nums[i-1]大的数,并交换他俩的位置
        while(v2 >= v1){
            if(nums[v2] > nums[v1-1]) 
                break;
            --v2;
        }
        swap(nums[v2], nums[v1-1]);

        // 直接反转 nums[v1-1:nums.size()+1]
        int v3 = (nums.size() - v1)/2;
        int i = 0;
        while(v3 > 0){
            swap(nums[v1+i], nums[nums.size() - 1 - i]);
            ++i; 
            --v3;
        }
        return;    
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值