lintcode--上一个排列

来源:互联网 发布:淘宝激光脱毛仪有用吗 编辑:程序博客网 时间:2024/05/24 06:56

题目描述:
给定一个整数数组来表示排列,找出其上一个排列。

注意事项:
排列中可能包含重复的整数。

样例:
给出排列[1,3,2,3],其上一个排列是[1,2,3,3]

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

思路讲解:
跟下一个排列的算法刚刚相反,就是从最后找一个递增序列,然后从其后面找到一个比他小的数,且这个数最接近他。交换这两个数,然后将其后面的数倒序排列。
举个栗子:1-4-2-3找到其递增(从后向前)的序列4-2,然后找到一个比4小的最大的数,即3,交换位置变成1-3-2-4,然后3后面的倒序排列变成1-3-4-2。

代码详解:

class Solution {public:    /*     * @param nums: A list of integers     * @return: A list of integers that's previous permuation     */    static bool cmp(int a,int b)    {        if(a<=b)        return false;        else        {            return true;        }    }    vector<int> previousPermuation(vector<int> &nums) {        // write your code here        if(nums.size()==0){            return vector<int> ();        }        int flag=-1;        for(int i=nums.size()-1;i>0;i--)        {            if(nums[i]<nums[i-1]){                flag=i-1;                int pos;                int max=INT_MIN;                for(int j=i;j<nums.size();j++)                {                    if(nums[j]-nums[flag]<0){                        if(nums[j]-nums[flag]>max){                            max=nums[j]-nums[flag];                            pos=j;                        }                    }                }                //cout<<flag<<"  "<<pos<<endl;                int temp=nums[flag];                nums[flag]=nums[pos];                nums[pos]=temp;                sort(nums.begin()+flag+1,nums.end(),cmp);                //cout<<nums.size()<<endl;                return nums;            }        }        sort(nums.begin(),nums.end(),cmp);        return nums;    }};

C++中有直接求前一个排列的函数

prev_permutation(nums.begin(),nums.end());
原创粉丝点击