#python算法100天 DAY02--Next_permutation(下一组排列)

问题提出:给定一个全序集,找到当前结构的下一组排列,比如123->132->213....

对待123,我们要找下一组排列,正常的想法是先看个位数3能不能替换成稍微大一点的数,而123中没有比3还大的数,所以不能换个位使这个数稍微变大一点成为下一组排列,所以我们开始找十位数,十位数是2,而个位数3正好比2大一点点,所以我们将3和2交换位置便能求出下一组排列132。

接着求132的下一组排列,也是一样从个位数开始,我们找比2稍微大一点的数,虽然找到3但是3在十位数上,与个位数的2交换之后会让数变得更小,所以没有合适的数能和2交换,接着看十位数3,显而易见也没有合适的数交换,最后看百位数1,发现2是第一比1大的,所以我们让1和2交换变为,231但是我们发现光是交换还不行,还要让31交换才能实现下一组排列。交换之后的下一组排列是213。

然后可以接着求出213的下一组排列,当我们求到最大的数321时,会发现全部都是按照这个规律,如果不放心可以再试一试1234(博主就很不放心)结果还是一样的。

所以总结一下规律就是,我们要从后往前找,当确定一个数i时,从后往前看i后面的序列是否有比i还要大的数,有的话交换这两个数的位置(有很多的话取第一个遇到比i大的数),接着将i后面的子序列转向(reversed方法)

贴上代码:

def permute(value):
    n = len(value)
    for i in reversed(range(n-1)):
        if value[i] < value[i+1]:
            break
    for j in reversed(range(i, n)):
        if value[i] < value[j]:
            value[i], value[j] = value[j], value[i]
            value[i + 1:] = reversed(value[i + 1:])
            print(value)
            break


permute(list('123'))

运行结果:

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值