题目描述
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1
翻译 :实现“下一个排列”函数,将排列中的数字重新排列成字典序中的下一个更大的排列。 如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序)
分析:当不存在升序,则当前排列是最大排列,只要旋转整个序列变成最小排列。
否则从后往前找到第一个一前一后升序的位置,交换这两个数,并将这两个数之后的数字翻转倒序即可
class Solution {
public:
void nextPermutation(vector<int> &num) {
if(num.size()<=1) return;
int i = num.size()-1;
while(i>0 && num[i]<=num[i-1]) --i; //从后往前找到第一个升序的位置
if(i==0) { //5,4,3,2,1
reverse(num.begin(),num.end());
}else{
int j = num.size()-1;
while(num[j]<=num[i-1]) --j;
swap(num[j],num[i-1]);
reverse(num.begin()+i,num.end()); //将i后的数字转换为升序
}
}
};
本文介绍了一个高效的算法来找出整数序列的下一个字典序排列。该算法首先从序列末尾开始寻找第一个升序对,然后交换该对并反转其后的元素以得到下一个更大的排列。若不存在这样的对,则将序列反转以获得最小排列。
540

被折叠的 条评论
为什么被折叠?



