当前位置: 代码迷 >> 综合 >> leetcode.31—Next Permutation
  详细解决方案

leetcode.31—Next Permutation

热度:39   发布时间:2023-11-22 09:14:47.0

本题大意就是求下一个比原排列大的全排列。例如: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());  }}
};