สมมติว่ามีรายการ nums เริ่มที่ index 0 แต่ละขั้นเดินได้ i+1, i-1, หรือ j ที่ nums[i] == nums[j] ต้องการขั้นตอนน้อยสุดไป index สุดท้าย
ตัวอย่าง: nums = [4,8,8,5,4,6,5] ผลลัพธ์ 3: 0→4 (ค่า 4), 4→3 (ค่า 5), 3→6 (ค่า 5)
ขั้นตอนการแก้ปัญหา
- สร้าง map
posเก็บ index ของแต่ละค่า - BFS:
q = deque([(0,0)]),visited[0] = True - วนลูปながら
q:u, d = q.popleft()- ถ้า
u == n-1: คืนd - เพิ่มเพื่อนบ้าน:
pos[nums[u]] + [u-1, u+1]ถ้ายังไม่เยี่ยม - ลบ
pos[nums[u]](ป้องกัน revisit ค่าเดิม)
ตัวอย่างโค้ด
class Solution:
def solve(self, nums):
from collections import defaultdict, deque
pos = defaultdict(list)
for i, n in enumerate(nums):
pos[n].append(i)
q = deque([(0, 0)])
n = len(nums)
visited = [False] * n
visited[0] = True
while q:
u, d = q.popleft()
if u == n - 1:
return d
for v in pos[nums[u]] + [u - 1, u + 1]:
if 0 <= v < n and not visited[v]:
visited[v] = True
q.append((v, d + 1))
del pos[nums[u]]
ob = Solution()
nums = [4, 8, 8, 5, 4, 6, 5]
print(ob.solve(nums))
อินพุต
[4, 8, 8, 5, 4, 6, 5]
เอาต์พุต
3