用一次交換在 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]
廣告