Mô tả bài toán
Cho một danh sách các số khác nhau. Tìm số lần hoán vị (swap) tối thiểu để sắp xếp danh sách theo thứ tự tăng dần.
Ví dụ: nums = [3, 1, 7, 5] → đầu ra 2 (hoán vị 3 với 1, sau đó 5 với 7).
Giải thuật
- Tạo bản sao đã sắp xếp:
sort_seq = sorted(nums). - Xây dựng ánh xạ
tabletừ giá trị sang chỉ số hiện tại trongnums. - Khởi tạo
swaps = 0. - Duyệt qua chỉ số
itừ 0 đếnn-1:n = nums[i],s_n = sort_seq[i](giá trị đúng ở vị trí i).- Nếu
s_n != n:- Tăng
swaps. - Hoán vị
nums[i]vànums[table[s_n]]. - Cập nhật
tablecho hai giá trị vừa hoán vị.
- Tăng
- Trả về
swaps.
Ví dụ mã Python
class Solution:
def solve(self, nums):
sort_seq = sorted(nums)
table = {}
for i, n in enumerate(nums):
table[n] = i
swaps = 0
for i in range(len(nums)):
n = nums[i]
s_n = sort_seq[i]
s_i = table[s_n]
if s_n != n:
swaps += 1
nums[s_i] = n
nums[i] = s_n
table[n] = s_i
table[s_n] = i
return swaps
ob = Solution()
nums = [3, 1, 7, 5]
print(ob.solve(nums))
Đầu vào
[3, 1, 7, 5]
Đầu ra
2