31.下一个排列
思路:方法一,先从后往前遍历,找到第一个相邻的逆序对nums[i]<nums[i+1],然后再从后往前找到第一个nums[j]>nums[i],交换这两个数,最后将i位置后面的数都reverse即可。
class Solution {
public:
vector<int> nextPermutation(vector<int>& nums) {
int lens=nums.size()-1;
int flag=0;
int i;
for(i=lens-1;i>=0;i--){
if(nums[i]<nums[i+1]) break;
}
int j=lens;
if(i>=0){
while(j>=0){
if(nums[j]>nums[i]){
swap(nums[i],nums[j]);
break;
}
j--;
}
}
reverse(nums.begin()+i+1,nums.end());
return nums;
}
};
思路:方法二,皮一下,用它自带的next_permutation函数,嘿嘿嘿。next_permutation、prev_permutation相关知识点
class Solution {
public:
vector<int> nextPermutation(vector<int>& nums) {
next_permutation(nums.begin(),nums.end());
return nums;
}
};