美文网首页
下一个排列

下一个排列

作者: Houtasu | 来源:发表于2018-07-31 19:17 被阅读0次

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
    必须原地修改,只允许使用额外常数空间。

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
    1,2,31,3,2
    3,2,11,2,3
    1,1,51,5,1
    解题思路:
    4,6,5,3,2,1
    对于上面这个例子来说,我们需要从右往左,找到第一个非升序的数字,也就是nums[i-1]<nums[i],得到i-1。这个例子是4所在的位置:0。如果没有找到非升序的数字,那就说明这是个全降序的数组,比如[3,2,1],这种直接返回反序数组就可以了。然后再次从右往左遍历,找到第一个大于4的数字,这里是5,然后把4和5换位置,变成5,6,4,3,2,1。然而这还不是结果,对于5以后的数字,需要从小到大排列。也就是5,1,2,3,4,6。这就是这个例子的答案了。
    代码如下:

    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        down = 0
        flag = 0
        for i in range(len(nums) - 1, 0, -1):
            if nums[i - 1] < nums[i]:
                down = i - 1
                flag = 1
                break
        if not flag:
            nums.reverse()
            return
    
        for i in range(len(nums) - 1, 0, -1):
            if nums[i] > nums[down]:
                nums[i], nums[down] = nums[down], nums[i]
                last = nums[down + 1:]
                last.reverse()
                nums[down + 1:] = last
                return
    

    相关文章

      网友评论

          本文标题:下一个排列

          本文链接:https://www.haomeiwen.com/subject/bstkvftx.html