lintcode 下一个排列(52)

给定一个整数数组来表示排列,找出其之后的一个排列。

 注意事项

排列中可能包含重复的整数

样例

给出排列[1,3,2,3],其下一个排列是[1,3,3,2]

给出排列[4,3,2,1],其下一个排列是[1,2,3,4]

********************************************************************************************

这问题类似于全排列问题,全排列问题有一种解法,叫字典序法。     参考  点击打开链接

题目意思是找,比给定序列大一点的最小序列。

步骤:

1.从右至左找第一个升序的两个元素。A[k]<A[k+1]

2.从右至k,找到第一个比A[k]大的元素A[i],交换A[k],  A[k]的位置

3.反转k+1到最后的元素


    vector<int> nextPermutation(vector<int> &nums) {
        // write your code here
        int p;
        int i;
        for(i=nums.size()-2;i>=0;i--){
            if(nums[i]<nums[i+1]){
                p=i;
                break;
            }
        }
        if(i<0){
            sort(nums.begin(),nums.end());
            return nums;
        }
        
        for(i=nums.size()-1;i>p;i--){
            if(nums[i]>nums[p]){ 
                swap(nums[i],nums[p]);
                break;
            }
        }
        
        reverse(nums.begin()+p+1,nums.end());
        return nums;
        
    }
*******************************************************************************************************

类似得到      上一个排列   的题目

    vector<int> previousPermuation(vector<int> &nums) {
        // write your code here
        int p;
        int i;
        for(i=nums.size()-2;i>=0;i--){
            if(nums[i]>nums[i+1]){
                p=i;
                break;
            }
        }
        if(i<0){
            sort(nums.begin(),nums.end());
            reverse(nums.begin(),nums.end());
            return nums;
        }
        
        for(i=nums.size()-1;i>p;i--){
            if(nums[i]<nums[p]){ 
                swap(nums[i],nums[p]);
                break;
            }
        }
        
        reverse(nums.begin()+p+1,nums.end());
        return nums;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值