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)
    • 删除 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

更新于: 2020-11-19

458 次浏览

开启您的 职业生涯

完成课程获得认证

开始学习
广告