Leetcode31. 下一个排列
Leetcode31. 下一个排列
题目描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须** 原地 **修改,只允许使用额外常数空间。
示例 1:
1 | 输入:nums = [1,2,3] |
示例 2:
1 | 输入:nums = [3,2,1] |
示例 3:
1 | 输入:nums = [1,1,5] |
示例 4:
1 | 输入:nums = [1] |
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
解题思路
这道题的题目有亿点难懂!!!
先看看啥叫下一个排列。以数字序列为例,其排列按照字典序以此为:
这样,排列 的下一个排列即为 。特别的,最大的排列 [$3,2,1] $的下一个排列为最小的排列 。
观察排列的规律,下一个排列组成的数字总是比当前排列组成的数字要大,除非是最后一个排列。那么根据题目的要求,我们需要找到一个比当前序列大,但是变化幅度最小的排列。
根据排列的规律,我们可以设计出以下算法:
- 从后往前遍历,找出第一个当前数比后面一个数小的数字,它的下标记为;
- 然后重新开始从后往前遍历,找到坐标后的数字中第一个比所指数字大的数字,它的下标记为;
- 交换和所指的数字;
- 将后面的所有数字反转。
根据所述算法,我们可以写出对应的代码。
示例代码
1 | void nextPermutation(vector<int>& nums) |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!