题目描述

给你一个正整数的数组 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

题解

这题主要出发点有以下几点:

  • 首先要求交换后的字典序变小,那么一定要大的和小的交换,并且大的在前
  • 其次要求交换后的字典序尽量大,那么在满足第一点的情况下,大的元素要尽量靠后
  • 最后小的元素要尽量大,并且靠左

满足这几点条件,也就是要从最右边开始往左寻找,找到第一个上升的数字 A[i](从左往右看是下降,即 A[i] > A[i+1])。 这一点只为了保证上面的条件1,也就是 A[i] 右边存在比它小的元素。

然后在 A[i+1] 到 A[n-1] 之间所有比 A[i] 小的数字中找最大的那个就行了。如果最大的有多个相同的,取最左边的一个。

因为 A[i+1] 到 A[n-1] 子数组是单调递增的,所以不用全部遍历一遍,只需要从最右边开始往左找到第一个比 A[i] 小的数就行了。 然后从这个数开始,继续往左找和它相等的数,直到最左边一个相等的数 ,就是答案了。

代码

        class Solution {public:vector<int> prevPermOpt1(vector<int>& A) {int n = A.size();for (int i = n-2; i >= 0; --i) {if (A[i] > A[i+1]) {for (int j = n-1; j > i; --j) {if (A[j] < A[i]) {for (int k = j; k >= i; --k) {if (A[k] != A[j]) {swap(A[i], A[k+1]);break;}}break;}}break;}}return A;}
};

后记

最后不管是用时还是空间消耗都超越了100%的用户:

每日算法系列【LeetCode 1053】交换一次的先前排列相关推荐

  1. LeetCode 1053. 交换一次的先前排列

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

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

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

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

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

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

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

  5. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  6. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  7. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  8. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  9. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  10. 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

最新文章

  1. Zsh vs. Bash不完全对比解析,zsh是一种更强大的被成为“终极”的Shell
  2. 清华大学人工智能研究院成立自然语言处理与社会人文计算研究中心
  3. 暗通道先验去雾实现过程分析
  4. SAP UI5 应用开发教程之十一 :SAP UI5 容器类控件 Page 和 Panel
  5. junit测试spring_使用Spring JUnit规则进行参数化集成测试
  6. 恐怖之城(深圳)系列1---K113大巴洗劫一空
  7. LeetCode 637. 二叉树的层平均值(层次遍历queue)
  8. 小程序成长之路(四)-- 深入腾讯云(环境搭建)
  9. QT/QML Text 部分功能(自动省略 自动换行 自动调节字体大小 调节行间距
  10. findmnt-寻找挂载的文件系统
  11. docker镜像下载太慢
  12. EXCEL表格-利用随机函数制作抽签工具(RAND)
  13. 便捷注册live、MSN邮箱
  14. form表单标签及控件
  15. python将一个word文档中内容全部复制,添加到另一个word文档末
  16. html设置列表编号起始值,Word多级编号怎么设置,要按我的要求作为起始值?
  17. OpenMV的资料下载
  18. 机载激光雷达测量技术理论与方法读书笔记(3)机载激光雷达测量数据的滤波分类
  19. POJ1655 树重心模板题
  20. 大端模式-小端模式详解

热门文章

  1. 写在2012的最后一天
  2. 码农们来一起讨论下数据库设计....
  3. 【转载】SQL Server 2005关于数据类型最大值(3)
  4. 基于OleDb的Excel数据访问
  5. 换个skin,换个心情
  6. c++前置声明的一点总结
  7. 人人都可以写贪吃蛇(白话javascript版)
  8. PaddlePaddle(5)——简单高效的部署与推理方法(Ⅱ)
  9. Vertx与Spring配合完成DML操作
  10. (转)通过 Javacore 诊断线程挂起等性能问题