实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
思路:
leetcode上非常好的思路。
1.首先从尾部查找,直到找到当前元素大于前一个元素为止,记录该位置;
对于[5,6,11,9,7,5,3,1],即查找到11>6,此时位置索引为2;
2.从该位置到数组尾部的子序列中,找到一个比前一位置的大且最接近的数;
对于[5,6,11,9,7,5,3,1],即在[11,9,7,5,3,1]找到7,7是比6大且最接近6的,从尾部开始遍历,遍历到大于6的索引即可;
3.将找到的数与前一位置的数交换;
对于[5,6,11,9,7,5,3,1],交换后变为[5,7,11,9,6,5,3,1];
4.将该位置到数组尾部的子序列进行升序排列,因为已经为降序,故首尾两两交换即可;
对于步骤3中的[5,7,11,9,6,5,3,1],交换后为[5,7,1,3,5,6,9,11];
注意:对于最大的排列,从小到大排列即可。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int index=nums.size()-1;
while(index>0&&nums[index]<=nums[index-1]){
index--;
}
if(index==0){
reverse(nums.begin(),nums.end());
}
else{
int i=nums.size()-1;
while(i>index&&nums[i]<=nums[index-1]){
i--;
}
swap(nums[index-1],nums[i]);
sort(nums.begin()+index,nums.end());
}
}
};