1.问题说明

上一个排序,随机给定一个数组,目标任务是找到“上一个排序”,那么什么是上一个排序呢?
这个问题可能很多人看到就直接懵逼了,所谓上一个排序,之的就是按照升序排序,然后依次选取次大的元素进行排序组合,如果本身就是完全升序的,那么上一个排序就是完全逆序。可能说完了还是有些迷糊,下面就用一个例子说明:

# 举个栗子:
[1,2,3]--这是一个完全升序,那么它的排序依次是:
[1,2,3] -> [1,3,2] -> [2,1,3] -> [2,3,1] -> [3,1,2] -> [3,2,1]
# 细心的你可能已经发现了这是一个闭环
# 那么此时如果给你一个数组:
[2,1,3],它的上一个排序是什么?----那就很容易知道了[1,3,2]

2.原理说明

通过上面的栗子我想我已经说明白了什么是上一个排序,但是知道了问题还是不够的,我们要知道怎么解决问题,也就是怎么找到上一个排序,这才是我们最关注的问题,那我们就分析一下。

  • 首先,排列组合的顺序看的出来是从小的元素,到次小元素,再到更大元素,整体是一个升序的结构
  • 然后,知道了这样的生成的原理,我们需要找到比后一个元素大的元素,然后后一个元素与最后的元素交换位置
  • 最后,将改变降序元素后的序列逆序排列即可

3.代码实现

def preSort(nums):# 找到最后一个元素的位置preId = len(nums)-1# 遍历,停止条件是有一个元素的出现,导致不再是(逆方向)降序while(preId > 0 and nums[preId] >= nums[preId -1]):# 索引位置往左移动preId -= 1# 此时索引是在小的元素位置比如[2,1,3],此时preId在元素1位置# 索引在次左移,在元素2的位置了preId -= 1# 如果左移后发现小于0了,说明这是一个完全的升序数组,直接逆序排列即可if preId >= 0:# 找到转换swcId索引,此时索引所指位置为元素1的位置swcId = preId + 1# 遍历,停止条件是找到preId右边索引位置数值比当前位置大,比如:[2,1,3]从索引位置1向右寻找,找到元素3,停止,或者索引越界停止。while(nums[swcId] < nums[preId] and swcId < len(nums)):swcId += 1# 索引左移,找到了3swcId -= 1# 交换位置,即元素1和元素3交换位置,此时数组为[2,3,1]nums[swcId],nums[preId] = nums[preId],nums[swcId]# 左边的索引,左边索引指向元素1left = preId+1# 最后的元素索引位置right = len(nums)-1# 逆序排列while(right >left):nums[left],nums[right] = nums[right],nums[left]right -= 1left += 1return nums

LeetCode刷题之---上一个排序相关推荐

  1. leetcode刷题 153.寻找旋转排序数组中的最小值

    题目分析: 解法一: 该题是用来寻找最小值,我们可以直接用数组求最小值的方法来进行求解,但是我们观察到此题数组是一个 旋转数组,只要除第一位外后面每一位比第一位小,那么它就是最小值,否则第一位就是最小 ...

  2. C#LeetCode刷题之#83-删除排序链表中的重复元素(Remove Duplicates from Sorted List)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3820 访问. 给定一个排序链表,删除所有重复的元素,使得每个元素 ...

  3. C#LeetCode刷题之#26-删除排序数组中的重复项(Remove Duplicates from Sorted Array)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3622 访问. 给定一个排序数组,你需要在原地删除重复出现的元素, ...

  4. C#LeetCode刷题之#4-两个排序数组的中位数(Median of Two Sorted Arrays)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4005 访问. 给定两个大小为 m 和 n 的有序数组 nums1 ...

  5. Leetcode刷题 33.搜索旋转排序数组

    分析: 首先看到这题的第一印象是题目很长,感觉很复杂,但仔细看下来之后发现题目中间一段对解题没有任何的帮助,重点在最后一句,大概意思就是在目标数组中找到目标数据,并传出对应位置,否则传出-1 清楚了目 ...

  6. C#LeetCode刷题之#278-第一个错误的版本(First Bad Version)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3985 访问. 你是产品经理,目前正在带领一个团队开发新的产品.不 ...

  7. Leetcode刷题33. 搜索旋转排序数组

    升序排列的整数数组 nums 在预先未知的某个点上进行了旋转(例如, [0,1,2,4,5,6,7] 经旋转后可能变为 [4,5,6,7,0,1,2] ). 请你在数组中搜索 target ,如果数组 ...

  8. C#LeetCode刷题之#31-下一个排列(Next Permutation)

    目录 问题 示例 分析 问题 该文章已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4965 访问. 实现获取下一个排列的函数,算法需要将 ...

  9. C#LeetCode刷题之#496-下一个更大元素 I(Next Greater Element I)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4026 访问. 给定两个没有重复元素的数组 nums1 和 num ...

最新文章

  1. 敏捷开发中如何使用看板方法创造价值
  2. Android WebView缓存策略详解
  3. 【学习随手记】POSIX消息队列执行报Permission denied的问题。
  4. 关于搭建php电商环境时缺少fileinfo、数据库安装出错问题解决办法
  5. 每天写出好代码的5个建议
  6. mysql数据库group by_MySQL数据库对GROUP BY子句的功能扩展(1)
  7. Tesseract-OCR的简单使用与训练
  8. nodejs生成UID(唯一标识符)——node-uuid模块
  9. 聚类(1)-- k-means clustering
  10. 代码重构方向原则指导
  11. 苹果开发者三类账号说明
  12. 浏览器UserAgent的趣味史
  13. 二进制中 等比数列求和公式
  14. 定时任务实现方式对比
  15. 宏源药业上市破发:跌幅16% 公司市值168亿超募17亿
  16. iOS中制作一张水印图片
  17. 使用logisim设计简易CPU
  18. JsonParseException: Unexpected character (‘sss‘ (code xxx)): was expecting a colon to separ
  19. 简述防火墙--未知危险的屏障
  20. 实时即未来,车联网项目之phoenix on hbase 即席查询【四】

热门文章

  1. 我30岁自学编程,当上高级工程师,几度精疲力尽想放弃
  2. 以太坊实践经验之《eth.blockNumber结果为0》
  3. 删除 linux的ln文件夹,详解Linux ln 命令
  4. python爬淘宝商品销量信息_python爬取淘宝商品销量信息
  5. 数学建模竞赛必须要掌握的十个算法
  6. windows中合并磁盘
  7. POJ 3984-迷宫问题 (dfs)
  8. CSS选择符(选择器)
  9. 压缩机的 压缩比、内容积比、内压力比概念你不要搞混淆了
  10. 每天3分钟知晓天下事,一句话新闻资讯简报的公众号推荐