求下一个字典序更大的排列。
大致思路:
需要理解题意。
其实对于数字的序列来说,只关注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<int> &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;j<len;j++)
{
if(num[j]>num[i-1])
{
swap(num[j],num[i-1]);
break;
}
}
return;
}
};