zoukankan      html  css  js  c++  java
  • 【leetcode】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

    解题思路:要找出字典序小于自己的最大值,方法如下:从后往前遍历A,对于任意一个A[i],在[i+1,A.length]区间内找出比自己小的最大值,如果能找到这样的值,则这两个元素交换,交换之后的A即为字典序小于自己的最大值。怎么找出[i+1,A.length]区间内找出比自己小的最大值?可以把区间内所有的值存入有序的数组中,通过二分查找即可。

    代码如下:

    class Solution(object):
        def prevPermOpt1(self, A):
            """
            :type A: List[int]
            :rtype: List[int]
            """
            import bisect
            dic = {}
            val_list = []
            for i in range(len(A)-1,-1,-1):
                inx = bisect.bisect_left(val_list,A[i])
                inx -= 1
                if inx >= 0 and inx < len(val_list):
                    A[i], A[dic[val_list[inx]]] = A[dic[val_list[inx]]], A[i]
                    break
                if A[i] not in dic:
                    bisect.insort_left(val_list,A[i])
                dic[A[i]] = i
            return A
  • 相关阅读:
    2020.8月总结
    fps逆向总结
    fps人物基址的寻找
    python学习_012
    python学习_011
    python学习_010
    python学习_009
    python学习_008
    pytorch DataLoader模块的使用
    python 继承类的初始化用法
  • 原文地址:https://www.cnblogs.com/seyjs/p/10929238.html
Copyright © 2011-2022 走看看