本题大意就是求下一个比原排列大的全排列。例如:1,2,3有6种排列方式(按从小到大的顺序){(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)}根据这个表,123的下一个全排列是132
1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
本题思路就是从后往前找,直到找到一个元素b,比它的前一个元素要大(我们把它的前一个元素记a)。然后将a与a以后比a大的最小元素替换。替换后,从b以后的这个序列一定是一个降序序列,可以用反证法来证明(在此证明略),之后只需反向保存就可以。
另外别忘了题目中要求,如果不存在下一个全排列的情况:这时候说明此排列已经是最大排列,直接是一个降序序列,所以直接反向输出即可。
这里要用到STL的反转函数reverse:reverse
要知道的是它的参数是两个迭代器
详见AC代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
bool flag=0;
for(int i=nums.size()-1;i>0;i--){
if(nums[i]>nums[i-1]){
flag=1;
int min=nums[i],path=i;
for(int j=i;j<nums.size();j++){
if(nums[j]<=min&&nums[j]>nums[i-1]){
min=nums[j];
path=j;
}
}
swap(nums[i-1],nums[path]);
// cout<<nums[i-1]<<endl;
//for(int j=0;j<(nums.size()-i)/2;j++){
reverse(nums.begin()+i,nums.end());
// swap(nums[i+j],nums[nums.size()-1-j]);
//}
break;
}
}
if(!flag){
reverse(nums.begin(), nums.end());
}
}
};