leetcode —— 31. 下一个排列

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————————
解题思路:首先需要知道字典序的意思,意思的数组的排序是按照字典的规则排序的。

在这里插入图片描述
对于上面这个数组,按照字典序,下一个较大的字典序为
在这里插入图片描述
也就是首先将图中的5和4进行交换,那么数字由158476531变为158576431,也就是在4之后的所有数字中选择一个大于4的最小值,也就是5。然后需要对交换后的76531进行排序,变为13567,数字就变为158513467。
在这里插入图片描述
因此我们整体的计算方法为:
(1)倒序遍历,当nums[i]<nums[i+1]的时候,就得到了要交换的数值。比如上面的4;
(2)从4向后遍历,4的位置为nums[i],当遍历到nums[k]>nums[i]>nums[j]时,将nums[k]和nums[i]的位置进行交换;
(3)将nums[i]之后的数据进行从小到大排序;

其Python代码如下:

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        length = len(nums)
        i = length - 2
        while i>=0 and nums[i] >= nums[i+1]:  # 找到nums[i]<nums[i+1]的位置
            i-=1
        if i>=0: # 交换位置
            j = i+1
            while j<length and nums[j]>nums[i]:
                j+=1
            temp = nums[j-1]
            nums[j-1] = nums[i]
            nums[i] = temp
            
        L = i+1  # 将nums[i]之后的数据进行排序
        R = length-1
        while L<R:
            temp = nums[L]
            nums[L] = nums[R]
            nums[R] = temp
            L+=1
            R-=1
发布了320 篇原创文章 · 获赞 21 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37388085/article/details/105309923