刚开始的时候,没怎么理解题意,不知道具体是要干什么。
后来仔细想了下,是这么回事:
给定一个数组,比如1,7,2,4,1
我们不妨把它看作数字 17241,题目要求寻找下一个更大的排列,在数字的角度来看,我们的任务就是重新排列它,找到比17241更大的数字中 最小的那一个,也就是 17412,那么如何来操作呢?
我们设想这样一个排列:6,5,4,3,2,1; 很显然,没有比它更大的了,也即从左到右降序的排列,是不需要动的。
现在修改一下,给定:3,2,6,5,4,3,2,1;很显然,后面的 “部分降序片段 654321” 是暂时不需要动的;
我们要做的是找到6左边的2,让它和6后面的3交换,变为:
3,3,6,5,4,2,2,1
再将6到最后的部分,排序:
3,3,1,2,2,4,5,6 这就是最后的结果;
归纳来讲:从后往前,i 的移动 找第一个不按降序排列的数字。确定了 i 的位置,从后往前,找第一个比 i位置 大的数, 将它和 i位置 交换。最后,把 i 到最后的部分,变为升序。
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums)
{
int i = nums.size() - 1;
int j,temp;
if (i == 0 || i == -1) //如果空数组 或者就一个数
return;
while (i&&nums[i - 1] >= nums[i])
i--; //寻找不按降序的第一个数
if (!i) //如果这个数组是完全降序的
{
sort(nums.begin(), nums.end());
return;
}
if (i == nums.size() - 1) //如果i根本没动
{
temp = nums[i];
nums[i] = nums[i - 1];
nums[i - 1] = temp;
}
for ( j = nums.size() - 1; j > i; j--) //寻找大于nums【i-1】的位置
if (nums[j] > nums[i - 1])
{
temp = nums[j];
nums[j] = nums[i-1];
nums[i-1] = temp;
break;
}
for (i, j = nums.size() - 1; i <= j; i++, j--) //后面的部分 变为升序
{
temp = nums[j];
nums[j] = nums[i];
nums[i] = temp;
}
return;
}
};