下一个排序(哈哈题目很好玩记录下)

例如 2, 6, 3, 5, 4, 1 这个排列, 我们想要找到下一个刚好比他大的排列,于是可以从后往前看 我们先看后两位 4, 1 能否组成更大的排列,答案是不可以,同理 5, 4, 1也不可以 直到3, 5, 4, 1这个排列,因为 3 < 5, 我们可以通过重新排列这一段数字,来得到下一个排列 因为我们需要使得新的排列尽量小,所以我们从后往前找第一个比3更大的数字,发现是4 然后,我们调换3和4的位置,得到4, 5, 3, 1这个数列 因为我们需要使得新生成的数列尽量小,于是我们可以对5, 3, 1进行排序,可以发现在这个算法中,我们得到的末尾数字一定是倒序排列的,于是我们只需要把它反转即可 最终,我们得到了4, 1, 3, 5这个数列 完整的数列则是2, 6, 4, 1, 3, 
class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        // [1 2 3] -> [1 3 2] ->[2 1 3]-> [2 3 1]->[3 1 2] ->[3 2 1]
        int n = nums.size();
        int l = -1;
        for(int i = n-1; i>=0; i--){
            if(i == n-1)continue;
            if(nums[i] < nums[i+1]) {
                l = i;
                break;
            }
        }
        //cout<<l<<endl;
        if(l == -1)  reverse(nums.begin(),nums.end());
        else{
            
            for(int i = n-1; i>l ;i--){
                if(nums[i]>nums[l]) {
                    swap(nums[i],nums[l]);
                    break;
                }
            }
            reverse(nums.begin()+l+1,nums.end());
        }
    }
};

 

posted on 2022-06-27 23:35  xhskjjmc  阅读(20)  评论(0)    收藏  举报