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 };
Mamba never out

浙公网安备 33010602011771号