สมมติว่ามีรายการตัวเลขที่ไม่ซ้ำกัน ต้องการหาจำนวนการสลับ (swaps) น้อยที่สุดเพื่อเรียงลำดับจากน้อยไปมาก
ตัวอย่าง: nums = [3, 1, 7, 5] ผลลัพธ์คือ 2 สลับ 3 กับ 1 แล้วสลับ 5 กับ 7
ขั้นตอนการแก้ปัญหา
- สร้าง
sort_seq= เรียงnums - สร้าง map
tableเก็บ index ของแต่ละค่าในnumsเดิม swaps = 0- วนลูป
iจาก 0 ถึง n-1:n = nums[i],s_n = sort_seq[i],s_i = table[s_n]- ถ้า
s_n != n:swaps += 1- สลับค่าใน
numsและอัปเดตtable
- คืนค่า
swaps
ตัวอย่างโค้ด
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))
อินพุต
[3, 1, 7, 5]
เอาต์พุต
2