【理解题意】next permutation 下一个字典序更大的排列

【理解题意】next permutation 下一个字典序更大的排列_第1张图片

求下一个字典序更大的排列。

大致思路:

需要理解题意。

其实对于数字的序列来说,只关注2个数,其实要么是升序,要么是降序,要么是相等。这里不用考虑相等了,因为相等的话字典序也一样,那么就看如果原来是降序,比如1 3 2 1中后三个是降序,下一个字典序更大的排列是2 1 1 3,应该怎么求出来呢?可以发现,先把后三个降序的排成升序,但显然1 1 2 3的字典序是小于原来的1 3 2 1的,所以需要再从后三个数里找到第一个大于1的数2,将它与1交换,则相等于以2打头开始重新排,当然比1 3 2 1这种以1打头的字典序大啦。

那如果全都是降序的呢?按照题意,特殊情况,直接输出全部的升序。

那如果后面是升序没有降序呢?那更简单,跳过前面对降序排成升序的步骤,然后做法相同。

具体看程序,很清楚了。编程注意:对数组num进行sort直接sort(num,num+len),但对vector的话vector名不能直接代表首地址,必须要取.begin()和.end()或.begin()+len。

AC代码:

class Solution {
public:
    void nextPermutation(vector &num) {
        int len= num.size();
        if(len==0)
            return;
        if(len==1)
            return;
        //先找降序
        int i=len-1;
        while(i>0 && num[i]<=num[i-1])
            i--;
        if(i==0) //说明全是降序的,这是特殊情况,直接输出所有的升序序列就好了
        {
            sort(num.begin(),num.end());
            return;
        }
        //否则,把降序的部分变成升序,并且将其中第一个大于num[i-1]的数和num[i-1]换
        sort(num.begin()+i,num.end());
        for(int j=i;jnum[i-1])
            {
                swap(num[j],num[i-1]);
                break;
            }
        }
        return;
    }
};

 

你可能感兴趣的:(LeetCode,保研机试)