【笔试练习题】寻找下一个字典序

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 ;
    }
};

 

你可能感兴趣的:(c++学习笔记,笔试题)