1. 题目

给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的、按字典序排列小于 A 的 最大可能排列。

如果无法这么操作,就请返回原数组。

示例 1:
输入:[3,2,1]
输出:[3,1,2]
解释:
交换 2 和 1示例 2:
输入:[1,1,5]
输出:[1,1,5]
解释:
这已经是最小排列示例 3:
输入:[1,9,4,6,7]
输出:[1,7,4,6,9]
解释:
交换 9 和 7示例 4:
输入:[3,1,1,3]
输出:[1,3,1,3]
解释:
交换 1 和 3提示:
1 <= A.length <= 10000
1 <= A[i] <= 10000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/previous-permutation-with-one-swap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:LeetCode 31. 下一个排列(线性扫描)

注意题目说,只能交换一次

  • 新的字典序要小于A,要找一个A的 后部小的 r 跟 前面大的 l 交换
  • 为了最大,当后序有满足的下降时,还要更新要交换的位置(【3,1,3,1】–>【3,1,1,3】),这两个3,1,选取更靠后的下降
  • 当有比左端点l小,但是比右端点r大的,更新右端点(【3,1,3,1,2】–>【3,1,2,1,3】),后面的3,1,可以交换,又遇到了比 3 (l)小,比 1 (r)大的 2,那么更新 r 为 2,获得更大的字典序
class Solution { //C++
public:vector<int> prevPermOpt1(vector<int>& A) {int i = 0, l = 0, r = 0;for(i = 1; i < A.size(); ++i){if(A[i-1] > A[i])//遇到下降, 更新, l,r越靠后越好l = i-1, r = i;//后序找到小于 A[l] 的数, 但是大于 A[r]的,//    用更大的与 l 交换,得到更大的字典序else if(A[i] < A[l] && A[i] > A[r])r = i;}swap(A[l], A[r]);return A;}
};

64 ms 23.7 MB

class Solution:# py3def prevPermOpt1(self, A: List[int]) -> List[int]:l, r = 0, 0for i in range(1,len(A)):if A[i-1] > A[i]:l, r = i-1, ielif A[i] < A[l] and A[i] > A[r]:r = it = A[l]A[l] = A[r]A[r] = treturn A

356 ms 14.9 MB

LeetCode 1053. 交换一次的先前排列相关推荐

  1. LeetCode 1053. 交换一次的先前排列(贪心法)

    题目 思路 这道题的要求初看还是比较复杂的:既要字典序小于原来的序列,又要在小于的字典序中求出最大值.按照题目的要求,应该尽量交换排在后面的元素,因为交换越到后面的元素所产生的的字典序"增量 ...

  2. 1053 交换一次的先前排列(分析)

    1. 问题描述: 给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的.按字典序排列小于 A 的最大可能排列.如果无法这么操 ...

  3. 1053. 交换一次的先前排列

    给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的.按字典序排列小于 A 的最大可能排列. 如果无法这么操作,就请返回原 ...

  4. leetcode1053. 交换一次的先前排列(贪心算法)

    给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的.按字典序排列小于 A 的最大可能排列. 如果无法这么操作,就请返回原 ...

  5. 【Leetcode -1721.交换链表中的节点 -2058.找出临界点之间的最小和最大距离】

    Leetcode Leetcode -1721.交换链表中的节点 Leetcode -2058.找出临界点之间的最小和最大距离 Leetcode -1721.交换链表中的节点 题目:给你链表的头节点 ...

  6. LeetCode 1053

    题目描述: 给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的.按字典序排列小于 arr 的最大排列. 如果无法这么 ...

  7. LeetCode 1247. 交换字符使得字符串相同

    1. 题目 有两个长度相同的字符串 s1 和 s2,且它们其中 只含有 字符 "x" 和 "y",你需要通过「交换字符」的方式使这两个字符串相同. 每次「交换字 ...

  8. LeetCode——剑指 Offer 38. 字符串的排列

    剑指 Offer 38. 字符串的排列 题目 输入一个字符串,打印出该字符串中字符的所有排列.你可以以任意顺序返回这个字符串数组,但里面不能有重复元素.示例:输入:s = "abc" ...

  9. LeetCode每日一题--31. 下一个排列(数学)

    题目:跳转至 31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原 ...

最新文章

  1. 斯人若彩虹,遇上方知有
  2. python免费课程讲解-Python零基础免费入门课程
  3. jquery书写一个简易的二级联动
  4. MIL for PRE
  5. 【Linux】一步一步学Linux——reboot命令(197)
  6. 基于Sql Server 2008的分布式数据库的实践(三)
  7. 基于高阶累积量的数字调制信号分类(Hierarchical Digital Modulation Classification Using Cumulants例1复现)
  8. 一、uniapp项目(封装异步请求、moment.js时间处理、封装手势滑动组件、下载图片到本地)
  9. 又一位!发40篇SCI,90后博士受聘985教授
  10. python中pandas是指什么_Python中的神器Pandas,但是有人说Pandas慢...
  11. python--pdb
  12. Linux环境安装配置Swftools
  13. LeetCode 33. Search in Rotated Sorted Array
  14. Elasticsearch的javaAPI之get,delete,bulk
  15. appium问题解决
  16. 百度UEditor图片上传、SpringMVC、Freemarker、Tomcat、Nginx、静态资源
  17. 「缠师课后回复精选」第15课:没有趋势,没有背驰。
  18. matplotlib如何绘制圆
  19. c++自学笔记第五次
  20. **Multisim中如何测量时序**急!急!急!急!急!

热门文章

  1. python选取特定行_pandas.DataFrame选取/排除特定行的方法
  2. psql切换schema_PostgreSQL教程(二):模式Schema详解
  3. 深入理解ES6之迭代器与生成器
  4. [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项
  5. Spring的核心机制依赖注入,Junit测试与Java基础Getter和Setter两种方法意义——2017.07.26...
  6. HDU5971【瞎搞】
  7. [转]java 组播
  8. 浅析调用android的content provider(一)
  9. .NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例
  10. 终于……我的游戏………简体版就要发布了!