使用Python进行一次交换的先前排列

假设我们有一个由正整数组成的数组A(不一定是唯一的),我们必须找到一个小于A的按字典顺序排列的最大排列,可以通过一次交换实现(一次交换交换两个数字A [i]和A [j])。如果不可能,则返回相同的数组。因此,如果数组类似于[3,2,1],则通过交换2和1,输出将为[3,1,2]

为了解决这个问题,我们将遵循以下步骤-

  • n:= A的大小

  • 在范围n – 2到-1之间

    • 如果left = -1,则返回A,否则返回A [left]> A [left + 1],然后中断

  • 元素:= 0,索引:= 0

  • 对于在左+ 1至n范围内的右

    • 元素= A [右]

    • 索引:=对

    • 如果A [right] <A [left]和A [right]>元素,则

  • 交换A [左]和A [索引]

  • 返回A

让我们看下面的实现以更好地理解-

示例

class Solution(object):
   def prevPermOpt1(self, A):
      n = len(A)
      for left in range(n-2,-2,-1):
         if left == -1:
            return A
         elif A[left]>A[left+1]:
            break
      element = 0
      index = 0
      for right in range(left+1,n):
         if A[right]<A[left] and A[right]>element:
            element = A[right]
            index = right
      temp = A[left]
      A[left] = A[index]
      A[index] = temp
      return A
ob = Solution()print(ob.prevPermOpt1([4,2,3,1,3]))

输入值

[4,2,3,1,3]

输出结果

[4, 2, 1, 3, 3]