31.Next Permutation 下一个排列

  1. 题目
    Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
    If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
    The replacement must be in-place, do not allocate extra memory.
    Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1
    使用Google翻译了一下,大体意思为:实现下一个排列,将数字重新排列成数字的下一个更大排列,如果这种安排是不可能的,它必须将其重新排列为尽可能低的顺序(即以升序排序)。替换必须在原位置,不要分配额外的内存。
    什么是一个排列?什么是一个更大的排列?把我搞懵逼啦,搜了一资料,其实排列就是数学中的排列组合,只是参与排列的元素是一个个整数,而这些整数从高位到底为组合起来就是一个多位数的整数,所谓下一个更大的排列即为比这个多位整数大一点数。例如:输入序列为 1,2,3 即组合起来的多位整数为123,而比这个多位整数大一点的整数为132,其元素排列为1,3,2;

  2. 题目分析
    看到有大神博客中这样剖析:在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*i,后一个记为*ii,并且满足*i < *ii。然后再从尾端寻找另一个元素*j,如果满足*i < *j,即将第i个元素与第j个元素对调,并将第ii个元素之后(包括ii)的所有元素颠倒排序,即求出下一个序列了。
    首先从序列的尾部开始前后两两比较,找到第一次后一个大于前一个的位置记为ii,则从ii位置开始为递减序列,就像减函数一样随着ii值的增大,函数值递减;而ii的前一个元素i的值小于ii位置的值,若此时序列组成的整数为m,在所有大于m的组合中找到最小的一个序列,即在m组合中的ii位置到最后一个元素中找到那个大于i位置元素值的最小位置,记为j。
    寻找j位置:由于组合m中ii位置开始元素是递减序列,我们只需要从m组合的尾部开始寻找,找到第一个大于i位置元素值的位置记为j;交换i元素与j元素。
    尾部元素升序排序:从ii位置开始到元素最后进行升序排序来得到最小的组合数
    特殊情况即m组合已经是最大的组合啦,直接进行反序,得到最小的组合。

  3. 代码如下:

# *-  coding:utf-8  -*

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        numsIndex=len(nums)-1
        while numsIndex>=1 and nums[numsIndex-1]>=nums[numsIndex]:
            numsIndex-=1
        if numsIndex==0:  #这是个递减序列
            nums.reverse()
            return 
        secIndex=numsIndex-1
        for x in xrange(len(nums)-1,numsIndex-1,-1):
            if nums[x] > nums[secIndex]:
                secIndex=x
                break   #secIndex为降序,第一个大于nums[secIndex]的值即为所需
        #交换两个元素值
        nums[numsIndex-1]=nums[numsIndex-1]^nums[secIndex]
        nums[secIndex]=nums[numsIndex-1]^nums[secIndex]
        nums[numsIndex-1]=nums[numsIndex-1]^nums[secIndex]
        tmp=nums[numsIndex:]
        tmp.sort()  #部分升序排序
        nums[numsIndex:]=tmp
mynp=Solution()
a=[1,1]
mynp.nextPermutation(a)
print a



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值