31. 下一个排列

next_permutation的实现方法:

1、从数组的末尾往前找,找到 第一个位置 j,使得 nums[j] < nums[j + 1]。
2、如果不存在这样的 j,将数组逆转。                                                       //情况1
3、如果存在这样的 j,则从末尾往前找,找到第一个位置 i > j,使得 nums[i] > nums[j]。
      交换 nums[i] 与 nums[j],然后将数组从 j + 1 到末尾部分逆转即可。      //情况2

 

 1 class Solution 
 2 {
 3 public:
 4     void nextPermutation(vector<int>& nums) 
 5     {
 6         int n = nums.size();
 7         int j = n - 2;
 8         for(;j >= 0;j --) //从数组的末尾往前找,找到 第一个位置 j,使得 nums[j] < nums[j + 1]。
 9         {
10             if(nums[j] < nums[j + 1]) break;
11         }
12         if(j == -1) reverse(nums.begin(),nums.end()); //如果不存在这样的 j,将数组逆转。
13         else 
14         {
15             int i = n - 1;
16             for(;i > j;i --)//如果存在这样的 j,则从末尾往前找,找到第一个位置 i > j,使得 nums[i] > nums[j]。
17             {
18                 if(nums[i] > nums[j]) break;
19             }
20             swap(nums[i],nums[j]);//交换 nums[i] 与 nums[j]
21             reverse(nums.begin() + j + 1,nums.end());//将数组从 j + 1 到末尾部分逆转即可
22         }
23     }
24 };

 

posted @ 2020-03-16 19:24  Jinxiaobo0509  阅读(110)  评论(0)    收藏  举报