Leetcode 31下一个排列 (难)

31. 下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

 

这是一个找规律的题目,如果数组已经是一个完全降序数组,那么答案就是整个数组反转,对应的就是完全升序

 

根据递归性:

123456
123465
123546
...
654321

从一个数排序变成下一个数的排序,应该从右往左边扫。找到第一个降序的位置。和他\

 

 

Leetcode 31下一个排列 (难)_第1张图片

 

 

Leetcode 31下一个排列 (难)_第2张图片

Leetcode 31下一个排列 (难)_第3张图片

Leetcode 31下一个排列 (难)_第4张图片

Leetcode 31下一个排列 (难)_第5张图片

这题难度较大,边界条件也比较多。在国内面试中往往很少出现,在外企面试中如果出现,要和面试管沟通清楚思路。在写代码时用case测试,注意边界的情况。

class Solution {
public:
    void nextPermutation(vector& nums) {
        int k = nums.size()-1;
        while(k>0&&nums[k-1]>=nums[k]) k--;
        if(k<=0){
            reverse(nums.begin(),nums.end());
            return;
        }
        int i = k-1;
        while(knums[i]) k++;
        swap(nums[i],nums[k-1]);
        reverse(nums.begin()+i+1,nums.end());
    }
};

 

 

 

 

你可能感兴趣的:(算法)