问题描述:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
题目解析:
本题目的意思是给定一个整数,找到下一个比它大的整数。如3659 , 下一个比它要大的数是3695。这就是下一个排列的含义。
具体算法步骤为:
【1】从后往前进行位置交换,这样会更容易找到下一个较大排列
【2】找到降序排列部分,然后将最小的大数与第一个非逆序排列的数进行交换;
【3】然后再将该逆序进行逆置,使其变成升序。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=0, j=nums.size()-1;
for(i=nums.size()-1; i && nums[i-1]>=nums[i]; --i); //从逆序开始扫描
if(i){
for(j=nums.size()-1; i<j && nums[i-1]>=nums[j]; --j);
swap(nums[i-1],nums[j]); //交换两个元素
}
reverse(nums.begin()+(i-1==j?0:i),nums.end()); //进行逆序反转
}
};