leetcode日记(21)下一个排列

leetcode日记(21)下一个排列_第1张图片

刚看到这道题的时候可能觉得有些难度,一开始我的思路是暴力解法,将所有字母排列一一列出来,后来一想觉得时间复杂度太大了,消耗空间也多。

然后我打算找规律,在尝试分析一些例子后找到了直接的规律。

思路是将nums从后往前搜寻,找到前一个数比后一个数小的位置,从这个位置开始改变,寻找后面搜寻过的数中比前一个数字大的最小数,将它移至前面,后面的数全部按从小到大排序排列即可。

代码如下:

class Solution {
public:
    void nextPermutation(vector& nums) {
        int n=nums.size();
        vector num;
        int t=n-1;
        bool o=0;
        for(;t>0;t--){
            if(nums[t]>nums[t-1]) {o=1;num.push_back(nums[t]);nums.pop_back();t--;break;}
            else {num.push_back(nums[t]);nums.pop_back();}
        }
        if(o==0){
            num.push_back(nums[0]);nums.pop_back();
            nums.insert(nums.end(),num.begin(),num.end());
        }
        else{
            num.push_back(nums[t]);nums.pop_back();
            for(int i=0;inum[num.size()-1]){nums.push_back(num[i]);num.erase(num.begin()+i);break;}
            }
            sort(num.begin(),num.end());
            nums.insert(nums.end(),num.begin(),num.end());
        }
    }
};

你可能感兴趣的:(leetcode,算法,职场和发展)