31. Next Permutation

31. Next Permutation

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.size()<2)
            return; 
        for(int i=nums.size()-2;i>=0;i--){
            if(nums[i]<nums[i+1]){
                for(int j=nums.size()-1;j>i;j--){               //找出大于num是[i]的数字中,最小的那个
                    if(nums[i]<nums[j]){
                        swap(nums[i],nums[j]);
                        sort(nums.begin()+i+1,nums.end());
                        return;
                    }
                }
            }
        }
        sort(nums.begin(),nums.end());
    }
};

数学中的排列组合,比如“1,2,3”的全排列,依次是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
所以题目的意思是,从上面的某一行重排到期下一行,如果已经是最后一行了,则重排成第一行。


6 5 4 8 7 5 1
这个题刚开始看我是懵的,因为以前没接触过全排序,不知道它要干嘛,了解了全排序之后,其实就是交换数据,比如说需要交换第i和第j个元素(假设i<j),则交换完之后,第i+1及其之后的元素要进行重排序,使其递增;那么现在的问题就是找到要交换的元素,我所做就是从后往前查找:


(1)比如现在要查倒数第k个元素,则从倒数第一个元素到倒数第k+1个元素进行顺序查找,若找到其中有一个元素的值大于倒数第k个元素的值,则进行交换,并在交换后按照上述方法排序。


(2)若后面元素的值都比倒数第k个值小(或相等),则倒数第k个元素到倒数第一个元素形成一个非严格递减序列,则k--,继续(1);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值