Giả sử chúng ta muốn triển khai phương thức hoán vị tiếp theo, phương thức này sắp xếp lại các số thành hoán vị lớn hơn về mặt từ điển. Nếu không thể sắp xếp như vậy, phương thức sẽ sắp xếp lại theo thứ tự thấp nhất có thể (tức là sắp xếp tăng dần). Thay thế phải thực hiện tại chỗ (in-place) và không sử dụng bộ nhớ thêm. Ví dụ:
1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1
Các bước thực hiện
found:= false,i:= độ dài mảng - 2.- Khi
i >= 0:- Nếu
A[i] < A[i + 1], thìfound := True, thoát vòng lặp. - Giảm
iđi 1.
- Nếu
- Nếu
found := false, sắp xếp mảngA. - Ngược lại:
m:= tìm chỉ số phần tử lớn nhất từ chỉ sối + 1trongA, và lớn hơnA[i].- Hoán đổi
A[i]vàA[m]. - Đảo ngược tất cả phần tử từ
i+1đến cuối trongA.
Ví dụ minh họa
class Solution(object):
def nextPermutation(self, nums):
found = False
i = len(nums) - 2
while i >= 0:
if nums[i] < nums[i+1]:
found = True
break
i -= 1
if not found:
nums.sort()
else:
m = self.findMaxIndex(i+1, nums, nums[i])
nums[i], nums[m] = nums[m], nums[i]
nums[i+1:] = nums[i+1:][::-1]
return nums
def findMaxIndex(self, index, a, curr):
ans = -1
index = 0
for i in range(index, len(a)):
if a[i] > curr:
if ans == -1:
ans = curr
index = i
else:
ans = min(ans, a[i])
index = i
return index
ob1 = Solution()
print(ob1.nextPermutation([1,2,5,4,3]))
Đầu vào
[1,2,5,4,3]
Đầu ra
[1, 3, 2, 4, 5]