题目链接
英文链接:https://leetcode.com/problems/previous-permutation-with-one-swap/
中文链接:https://leetcode-cn.com/problems/previous-permutation-with-one-swap/
题目详述
给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的、按字典序排列小于 A 的最大可能排列。
如果无法这么操作,就请返回原数组。
示例 1:
1 | 输入:[3,2,1] |
示例 2:
1 | 输入:[1,1,5] |
示例 3:
1 | 输入:[1,9,4,6,7] |
示例 4:
1 | 输入:[3,1,1,3] |
提示:
- 1 <= A.length <= 10000
- 1 <= A[i] <= 10000
题目详解
- LeetCode31-下一个排列 是求下一个排列,而本题则求比当前排列小的最大排列。
- 从后往前找到第一组位置,满足
A[i] > A[i + 1]
(若找不到,说明是第一个排列,直接返回)。 - 在
[i + 1, A.length - 1]
中找到小于A[i]
最大的数,它的位置记为k
。 - 交换
i
、k
两处的值,得到的排列即为所求。
1 | public class LeetCode_01053 { |