zoukankan      html  css  js  c++  java
  • LeetCode 1053. Previous Permutation With One Swap

    原题链接在这里:https://leetcode.com/problems/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

    题解:

    From right to left, find the first element A[i - 1] > A[i]. Mark first position = i - 1.

    If we can't find it, then there is no previouis perrmutation.

    Then mark second position = i, and for j > i, find the last position that A[j] > A[j - 1] && A[j] < A[first]. If we find any, keep updating second position.

    Swap first and second positions.

    Time Complexity: O(n). n = A.length.

    Space: O(1).

    AC Java:

     1 class Solution {
     2     public int[] prevPermOpt1(int[] A) {
     3         if(A == null || A.length == 0){
     4             return A;
     5         }
     6         
     7         int n = A.length;
     8         int i = n - 1;
     9         while(i >= 1 && A[i] >= A[i - 1]){
    10             i--;
    11         }
    12         
    13         if(i == 0){
    14             return A;
    15         }
    16         
    17         int first = i - 1;
    18         int second = i;
    19         for(int j = i + 1; j < n; j++){
    20             if(A[j] > A[j - 1] && A[j] < A[first]){
    21                 second = j;
    22             }
    23         }
    24             
    25         int temp = A[first];
    26         A[first] = A[second];
    27         A[second] = temp;
    28         return A;
    29     }
    30 }

    类似Next Permutation.

  • 相关阅读:
    使用jquery.validate.js实现boostrap3的校验和验证
    MySQL 随机取数据效率问题
    qq在线客服代码
    使用Shell脚本查找程序对应的进程ID,并杀死进程
    Redis-概述
    JVM的类加载机制
    volatile
    java内存相关
    设计模式--模板方法
    设计模式概述
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12151385.html
Copyright © 2011-2022 走看看