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
广告