实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
这道题的思路很清晰,题解里官方给出的算法思路很明白易懂,算法的实现也比较简单,但是自己写的时候第一遍却错了,而且对比官方代码,偏多.
其实仔细看来,模块都是一样的,每个部分的功能也都一样
这里有这样几个点不如官方:
①在数组里for循环的时候,官方第一行代码令
i=nums.length-2;
然后再逐一比较nums[i]
和nums[i+1]
的值,比较完了之后i--
,退出条件是i>=0
这样就不会出数组index溢出问题,而且官方对于0这个界限的控制也很到位,不拖泥带水
②将reverse函数和swap函数写外面这是很基础的方法了,好处很明显.但是官方的更好的地方在于,官方的参数更加简洁,传一个数组,一个index进去就够了.
PS.还是感觉我太久没做算法题了,都生疏了