假设我们有一个称为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。最后,由于它们的值均为5,因此我们可以从索引3跳到6。
为了解决这个问题,我们将遵循以下步骤-
pos:=一个空的映射
对于每个索引i和以数值为单位的值n,
在pos [n]的末尾插入i
n:= nums的大小
Visited:=列出大小为n的列表,并用False填充
造访过[0]:=真
当q不为空时,执行
如果0 <= v <n且visited [v]为假,则
访问过[v]:=真
在q的末尾插入对(v,d + 1)
返回d
(u,d):= q的左元素,并删除左元素
如果u与n-1相同,则
对于列表pos [nums [u]]和[u-1,u + 1]中的每个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