用一次交换在 Python 中实现前一个排列
假设我们有一个正整数数组 A(不一定是唯一的),我们必须找到小于 A 的字典序最大的排列,可以通过一次交换来实现(一次交换交换两个数字 A[i] 和 A[j] 的位置)。如果不可能,则返回相同的数组。因此,如果数组像 [3,2,1] 一样,那么输出将是 [3,1,2],通过交换 2 和 1
为了解决这个问题,我们将按照以下步骤进行 -
- n := A 的大小
- 对于 left 从范围 n - 2 到 -1
- 如果 left = -1,则返回 A,否则当 A[left] > A[left + 1] 时,则中断
- element := 0,index := 0
- 对于 right 范围 left + 1 到 n
- 如果 A[right] < A[left] 且 A[right] > element,则
- element = A[right]
- index := right
- 如果 A[right] < A[left] 且 A[right] > element,则
- 交换 A[left] 和 A[index]
- 返回 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]
广告