Given an array A
of positive integers (not necessarily distinct), return the lexicographically largest permutation that is smaller than A
, that can be made with one swap (A swap exchanges the positions of two numbers A[i]
and A[j]
). If it cannot be done, then return the same array.
Example 1:
Input: [3,2,1] Output: [3,1,2] Explanation: Swapping 2 and 1.
Example 2:
Input: [1,1,5] Output: [1,1,5] Explanation: This is already the smallest permutation.
Example 3:
Input: [1,9,4,6,7] Output: [1,7,4,6,9] Explanation: Swapping 9 and 7.
Example 4:
Input: [3,1,1,3] Output: [1,3,1,3] Explanation: Swapping 1 and 3.
Note:
1 <= A.length <= 10000
1 <= A[i] <= 10000
思路:从后往前找,找当前位置后面的小于该位置值的最大值,交换两个位置的值
class Solution {
public:
vector<int> prevPermOpt1(vector<int>& A) {
int n = A.size();
vector<int>dp;
dp = A;
for(int i=n-1; i>=0; --i){
int max_val = 0;
int max_idx = -1;
for(int j=i+1; j<n; ++j){
if(A[j] < A[i]) {
if(A[j] > max_val){
max_val = A[j];max_idx = j;
}
}
}
if(max_idx != -1){
int temp = dp[i];
dp[i] = dp[max_idx];
dp[max_idx] = temp;
return dp;
}
}
return dp;
}
};