leetcode第31题
解法一(C++ STL函数):
class Solution {
public:
void nextPermutation(vector& nums) {
next_permutation(nums.begin(), nums.end());
return ;
}
};
解法二(经典算法):
class Solution {
public:
void nextPermutation(vector& nums) {
// 这是找字典序的下一个排列的程序,在STL中也有。
if(nums.size() < 2)
return;
// 根据参考资料,总共分为4步
// 1. 从后往前找到第一组nums[i1] < nums[i2]
int i1 = nums.size() - 2;
int i2 = nums.size() - 1;
while(i1 >= 0 && nums[i1] >= nums[i2]){
--i1;
--i2;
}
if(i1 < 0){
if(nums[0] > nums[nums.size() - 1]){
reverse(nums.begin() + i2, nums.end());
}
return ;
}
int j = nums.size() - 1;
// 2. 从后往前找到一个nums[j] > nums[i1]
while(j >= 0 && nums[j] <= nums[i1]){
--j;
}
// 3. swap nums[j], nums[i1]
swap(nums[j], nums[i1]);
// 4. reverse i2及以后的元素
reverse(nums.begin() + i2, nums.end());
return ;
}
};