【LeetCode】-- Next Permutation

1.题目描述

31.Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

样例:

1,2,31,3,2
3,2,11,2,3
1,1,51,5,1

2.问题关键:核心思想:下一个比较大的值,从后往前查找第一递增的位置。

例如:76 4 654321,第一个位置是4,再找到后面最小比4大的数,就是5,交换4和5

  • 变成76 5 644321。将后面的翻转765612344。

3.C++代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        for (int i = nums.size() - 1; i > 0; i --) {
            if(nums[i - 1] < nums[i]) {
                int j = i;
                while(nums[j + 1] > nums[i - 1] && j + 1 < nums.size()) j ++; // 从后往前找到第一个递增序列,记录, 查找前面一个大于这个值的数, 交换。
                swap(nums[i - 1], nums[j]);
                reverse(nums.begin() + i, nums.end()); // 交换后,将后面的数从小到大排列,就是下一个最大的。
                return ;
            }
        }
        reverse(nums.begin(), nums.end());//如果是完全单调递减,直接翻转就可以了。
    }
};
    原文作者:邓泽军_3679
    原文地址: https://www.jianshu.com/p/809a8227bcfb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞