Python程式:查詢到達最後一個索引的最小步數
假設我們有一個名為 nums 的數字列表,我們當前位於 nums[0]。在每一步中,我們可以從當前索引 i 跳到 i + 1 或 i - 1 或 j,其中 nums[i] == nums[j]。我們必須找到到達最終索引所需的最小步數。
因此,如果輸入類似於 nums = [4, 8, 8, 5, 4, 6, 5],則輸出將為 3,因為我們可以從索引 0 跳到索引 4,因為它們的值都為 4。然後我們跳回索引 3。最後,我們可以從索引 3 跳到 6,因為它們的值都為 5。
為了解決這個問題,我們將遵循以下步驟 -
- pos := 一個空對映
- 對於每個索引 i 和 nums 中的值 n,執行以下操作
- 在 pos[n] 的末尾插入 i
- n := nums 的大小
- visited := 建立一個大小為 n 的列表,並用 False 填充它
- visited[0] := True
- 當 q 不為空時,執行以下操作
- (u, d) := q 的左元素,並刪除左元素
- 如果 u 與 n - 1 相同,則
- 返回 d
- 對於 pos[nums[u]] 和 [u - 1, u + 1] 中的每個 v,執行以下操作
- 如果 0 <= v < n 且 visited[v] 為假,則
- visited[v] := True
- 在 q 的末尾插入對 (v, d + 1)
- 如果 0 <= v < n 且 visited[v] 為假,則
- 刪除 pos[nums[u]]
讓我們看看以下實現以獲得更好的理解 -
示例
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
廣告