力扣31题:下一个排列

力扣31题:下一个排列

  • 该操作直接在STL中有实现,支持重复元素;
  • 交换可以用swap函数;
  • 主要思路为从右往左数到第一个逆序对,逆序对的前者与之后的所有序列中比他大的最小值进行交换。最后把这一段进行reverse就可。
  • 如果该序列已经为最大值,则reverse整个序列。
class Solution {
public:
    //该方法支持序列中存在重复元素,且在 C++ 的STL中被采用:
    // next_permutation(nums.begin(), nums.end());
    void nextPermutation(vector<int>& nums) {
        int n = nums.size();
        for(int i = n-1 ; i >= 1; --i){
            if(nums[i] > nums[i-1]){
                int j = i;
                for(; j+1 < n; ++j){
                    if(nums[j+1] <= nums[i-1]) break;    //不加等号: 错误[1,5,1]
                }
                //下面三行等效于: swap(nums[i-1],nums[j]);
                int t = nums[j];
                nums[j] = nums[i-1];
                nums[i-1] = t;
                reverse(nums.begin() + i,nums.end());
                return;
            }
        }
        reverse(nums.begin() , nums.end());
    }
};
posted @ 2020-11-10 16:20  又啦  阅读(72)  评论(0编辑  收藏  举报