题目简介:
给你一个正整数数组 arr
(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i]
和 arr[j]
的位置)后得到的、按字典序排列小于 arr
的最大排列。
如果无法这么操作,就请返回原数组。
示例 1:
1 | 输入:arr = [3,2,1] |
示例 2:
1 | 输入:arr = [1,1,5] |
示例 3:
1 | 输入:arr = [1,9,4,6,7] |
提示:
1 <= arr.length <= 10^4
1 <= arr[i] <= 10^4
思路:
由于是得到小于 arr
的最大排列,所以交换的位置越往后越好,所以我们从前往后遍历,找到最后一个arr[i] < arr[i - 1]
的位置i - 1
作为需要交换的位置pos1
。
另外一个位置则往后遍历,找到小于arr[pos1]
并且和arr[pos1]
差值最小的arr[i]
,作为pos2
。
交换这两个位置即可。
tip:
- 当往后遍历遇到
arr[i + 1] == arr[i]
的情况时,直接continue
,因为两个值相等时,交换的位置越靠前则交换后的数组越大。
代码如下:
1 | class Solution { |