【LC1306】——跳跃游戏III

这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处。当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]。

请你判断自己是否能够跳到对应元素值为 0 的 任一 下标处。

注意,不管是什么情况下,你都无法跳到数组之外。
在这里插入图片描述

1. 思路

1.1 广度优先遍历(BFS)

在这里插入图片描述

1.2 深度优先遍历

将给定的start当作树的根节点,将start+arr[start]和start-arr[start]当作树的左右子树,即可构造一个深度优先遍历模型。
在这里插入图片描述

2. 代码

2.1 bfs

bfs总是需要队列,在这个题中还需要标记是否访问过。

class Solution:
    def canReach(self, arr: List[int], start: int) -> bool:
        if arr == []:return False
        N = len(arr)
        visited = {start}
        queue = [start]
        while queue:
            if arr[queue[0]] == 0:return True
            for v in [queue[0] + arr[queue[0]],queue[0] - arr[queue[0]]]:
                if 0<=v<N and v not in visited:
                    if arr[v] == 0:
                        return True
                    queue.append(v)
                    visited.add(v)
            queue.pop(0)
        return False

2.2 dfs

dfs说白了就是递归

class Solution:
    def canReach(self, arr: List[int], start: int) -> bool:
        N = len(arr)
        def dfs(arr,start,step):
            if start < 0 or start >= N:return False
            if step == N:return False
            if arr[start] == 0:return True
            return dfs(arr,start + arr[start],step + 1) or dfs(arr,start - arr[start],step + 1)
        return dfs(arr,start,0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InceptionZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值