这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况。我们再来看下面一个例子,有如下的一个数组
1 2 7 4 3 1
下一个排列为:
1 3 1 2 4 7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
解法一:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i,j,n=nums.size();
for(i=n-2;i>=0;--i)
{
if(nums[i+1]>nums[i]) //找出第一个左边小于右边的相邻数字
{
for(j=n-1;j>i;--j) //找出右边第一个大于该数字的数字
{
if(nums[j]>nums[i]) break;
}
swap(nums[i],nums[j]);
reverse(nums.begin()+i+1,nums.end());
return ;
}
}
reverse(nums.begin(),nums.end());
}
};
解法二:
利用C++STL标准库函数来实现
void nextPermutation(vector<int>& nums) {
next_permutation(begin(nums), end(nums));
}