题意
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
样例
样例
123 --> 132
543 --> 345
2345 --> 2354
思路
代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
if (n == 1) return ;//单独判断
int i = 0,mmax=INT_MIN;
// 从后往前遍历
for (i = n - 1;i >= 0;i --){
if (nums[i] < mmax) break;
mmax = max(mmax,nums[i]);
}
//当前数组就是最大的整数,反转输出最小的
if (i < 0) {
reverse(nums.begin(),nums.end());
return ;
}
int mmin = INT_MAX,pos=0;
//找比i位置大的数,但是是最小的数
for (int j = i + 1;j < n;j ++){
if(nums[j] > nums[i] && nums[j] < mmin) {
mmin = nums[j];
pos = j;
}
}
swap(nums[i],nums[pos]);、
//在i后面的开始排序
sort(nums.begin()+i+1,nums.end());
}
};