1053. Previous Permutation With One Swap

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. 1 <= A.length <= 10000
  2. 1 <= A[i] <= 10000
class Solution {
    public int[] prevPermOpt1(int[] A) {
        int n = A.length;
        int i = n - 1;
        while(i >= 1) {
            if(A[i - 1] <= A[i]) i--;
            else break;
        }
        if(i == 0) return A;
        i--;
        //System.out.print(i);
        int sec = A[i + 1], j = i + 2;
        int secind = i + 1;
        while(j < n) {
            if(A[j] > sec && A[j] < A[i]) {
                sec = A[j];
                secind = j;
            }
            j++;
        }
        int tmp = A[i];
        A[i] = A[secind];
        A[secind] = tmp;
        return A;
    }
}

如果是升序就无解。1.从右往左找第一个破坏降序的,比如4321,2》1所以破坏了降序,2就是我们要换的数字,

2.从2右边的数字中找出第一个比他小的,如果相同取左边,交换即可。

上一篇:【CF452F】Permutation(线段树维护哈希值)


下一篇:next_permutation函数的使用