给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的、按字典序排列小于 arr 的最大排列。
如果无法这么操作,就请返回原数组。
输入:arr = [1,9,4,6,7] 输出:[1,7,4,6,9] 解释:交换 9 和 7
思路:
1、arr[i] > arr[j] && i < j 交换后,数字才能变小
2、i 的位置 靠近数组最右边,改变低位数字,数据的变化最小,题目要求比“当前”小且“最大”数字
3、找到 i后,遍历j∈(i+1,len-1)中 < arr[i] && 最大的数字
class Solution {
//找到比我小的最大数字
public int[] prevPermOpt1(int[] arr) {
int len = arr.length;
int curMax = Integer.MIN_VALUE;
int lol = -1;
for(int i = len-2;i>=0;i--){
if(arr[i] > arr[i+1]){//1、定位到需要交换的位置
for(int j = i+1;j<len;j++){//2、找到需要交换的位置
if(arr[i] > arr[j]){
if(curMax < arr[j]){
curMax = arr[j];
lol = j;
}
}
}
//3、执行交换
int temp = arr[lol];
arr[lol] = arr[i];
arr[i] = temp;
return arr;
}
}
return arr;
}
}