博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
上一个排列
阅读量:2124 次
发布时间:2019-04-30

本文共 1411 字,大约阅读时间需要 4 分钟。

题目描述:给定一个整数数组来表示排列,找出其上一个排列。

样例:给出排列[1,3,2,3],其上一个排列是[1,2,3,3];给出排列[1,2,3,4],其上一个排列是[4,3,2,1]

方法与之前的“下一个排列”问题类似(详见:),如果上一个问题没有搞明白,请先移步给出的链接。在讲解这个问题之前,我会假设你已经完全明白“字典序”,“高位”,“低位”这些概念。

好了,看本题。找上一个排列,其实两个相邻的排列一定是满足拥有最长前缀的。所以,在“下一个排列”的问题中,我们是从右往左开始寻找需要改变的高位,这里,依然是类似的,我们从右往左开始寻找需要改变的高位。但是,不同的是,因为求取的是上一个排列,所以,我们找寻的目的是找到一个数值高的高位,将其数值变低,这一点与“下一个排列”是相反的。

所以,可以这样寻找:从右往左,找第一个不是降序的位置:例如,[2, 1, 3],3到1,降序;1到2,升序。于是定位需要改变的高位为数值2所在的位置。然后再从右往左寻找第一个比这个高位数值小的数,交换。这里,我们找到了1,于是,交换1和2,变成[1, 2, 3];最后,与“下一个排列”同理,因为只是上“一”个,所以,需要将高位之后的部分数组按降序排列。此处[1, 2, 3] -> [1, 3, 2]. 整个过程完成。

代码如下:

class Solution:    # @param num :  a list of integer    # @return : a list of integer    def previousPermuation(self, num):        n = len(num)        right = n - 1        # 从右往左,找第一个升序        while right > 0:            if num[right] < num[right - 1]:                break            else:                right -= 1        # 如果整个数组是降序排列,颠倒过来        if right == 0:            num.reverse()            return num        # 定位需要交换的高位        right -= 1        index = n - 1        # 从右往左,找第一个比这个高位小的低位        while index > right:            # 交换高地位            if num[index] < num[right]:                num[index], num[right] = num[right], num[index]                break            else:                index -= 1        # 将被交换的高位之后的部分数组按逆序排列,因为只是上1个        return num[:right + 1] + sorted(num[right + 1:], reverse=True)        # write your code here

转载地址:http://vvfrf.baihongyu.com/

你可能感兴趣的文章
TP5.1模板布局中遇到的坑,配置完不生效解决办法
查看>>
PHPstudy中遇到的坑No input file specified,以及传到linux环境下遇到的坑,模板文件不存在
查看>>
TP5.1事务操作和TP5事务回滚操作多表
查看>>
composer install或composer update 或 composer require phpoffice/phpexcel 失败解决办法
查看>>
TP5.1项目从windows的Apache服务迁移到linux的Nginx服务需要注意几点。
查看>>
win10安装软件 打开时报错 找不到 msvcp120.dll
查看>>
PHPunit+Xdebug代码覆盖率以及遇到的问题汇总
查看>>
PHPUnit安装及使用
查看>>
PHP项目用xhprof性能分析(安装及应用实例)
查看>>
composer安装YII
查看>>
Sublime text3快捷键演示
查看>>
sublime text3 快捷键修改
查看>>
关于PHP几点建议
查看>>
硬盘的接口、协议
查看>>
VLAN与子网划分区别
查看>>
Cisco Packet Tracer教程
查看>>
02. 交换机的基本配置和管理
查看>>
03. 交换机的Telnet远程登陆配置
查看>>
微信小程序-调用-腾讯视频-解决方案
查看>>
phpStudy安装yaf扩展
查看>>