zhizhizhiyuan

Next Permutation

    该算法还是比较简单的。一共分为三步,即:1. 找位置;2. 交换;3. 倒序。下面结合具体例子{3,7,9,8,6,2}来进行说明。

    1. 找位置。从末尾开始往前找到第一个降序的位置。如上述例子中,第一个降序的位置为1,值为7。再从该位置的后面部分找到从后往前找到第一个比该值大的数,即8,位置为3.

    2. 交换。对上述找到的位置的值进行交换。序列变成了{3,8,9,7,6,2}。

    3. 倒序。对第一个降序位置后面的部分进行倒序,即把{9,7,6,2}倒序为{2,6,7,9}。

    代码如下:

class Solution {
public:
    void nextPermutation(vector<int> &num) {
        int p,q,i,t=0;
        int guard;
        int N=num.size();
        if(num.size()<2)
            return;
        p=N-1;
        while(p>0&&num[p-1]>=num[p])
        {
            p--;
        }
        p--;
        
        if(p>=0)
        {
            for(i=N-1;i>p;i--)
            {
                if(num[i]>num[p])
                {
                    break;
                }
            }
            t=num[p];
            num[p]=num[i];
            num[i]=t;
        }
        p=p+1;
        q=N-1;
        while(p<q)
        {
            t=num[p];
            num[p]=num[q];
            num[q]=t;
            p++;q--;
        }
    }
};

  

posted on 2014-01-25 16:59  zhizhizhiyuan  阅读(146)  评论(0编辑  收藏  举报

导航