题目如下:
下一个排列
给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。
如果没有下一个排列,则输出字典序最小的序列。
左边是原始排列,右边是对应的下一个排列。
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
不允许使用额外的空间。
做题思路:
1、一开始没有读懂题意,其实意思是排列是这样的,如果是123,下一个排列就是逐渐增大的,一次为,123 132 213 231 312 321 如果是最后一个321,那么下一个又回到123,循环着来;
2、从后往前寻找升序序列,当升序序列到末尾的时候,找到升序中第一个大于下一个数字的数,交换之后再将升序许列排序,例如:
原来序列是146521,从后往前找到升序序列是1256,下一个数是4,在升序序列中,5是第一个大于4的数,交换5和4,然后从第三个数直到最后开始排序,最后结果是151246.如果原本序列从头到尾都是降序的,那么直接排序处理即可。
具体的C++代码如下:
class Solution {
public:
/**
* @param nums: a vector of integers
* @return: return nothing (void), do not return anything, modify nums in-place instead
*/
void nextPermutation(vector<int> &nums) {
// write your code here
int len=nums.size();
int i,j;
for(i=len-1;i>=0;i--)
{
for(j=len-1;j>i;j--)
{
if(nums[i]<nums[j])
{
swap(nums[i],nums[j]);
sort(nums.begin()+i+1,nums.end());
return;
}
}
}
sort(nums.begin(),nums.end());
}
};