Giả sử chúng ta có một mảng A gồm các số nguyên dương (không nhất thiết là duy nhất), chúng ta phải tìm hoán vị lớn nhất về mặt từ vựng nhỏ hơn A, hoán vị có thể được thực hiện bằng một lần hoán đổi (A hoán vị trao đổi vị trí của hai số A [i] và A [j]). Nếu không thể, hãy trả về cùng một mảng. Vì vậy, nếu mảng giống như [3,2,1], thì đầu ra sẽ là [3,1,2], bằng cách hoán đổi 2 và 1
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- n:=kích thước của A
- cho bên trái trong phạm vi n - 2 xuống -1
- nếu left =-1 thì trả về A, ngược lại khi A [left]> A [left + 1] thì ngắt
- phần tử:=0, index:=0
- cho phải trong phạm vi từ trái + 1 đến n
- nếu A [right] phần tử, thì
- phần tử =A [phải]
- index:=right
- nếu A [right] phần tử, thì
- hoán đổi A [trái] và A [chỉ mục]
- trả về A
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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]))
Đầu vào
[4,2,3,1,3]
Đầu ra
[4, 2, 1, 3, 3]