Leetcode 1306. 跳跃游戏 III

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

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

注意,不管是什么情况下,你都无法跳到数组之外。

示例 1:

输入:arr = [4,2,3,0,3,1,2], start = 5
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案:
下标 5 -> 下标 4 -> 下标 1 -> 下标 3
下标 5 -> 下标 6 -> 下标 4 -> 下标 1 -> 下标 3
示例 2:

输入:arr = [4,2,3,0,3,1,2], start = 0
输出:true
解释:
到达值为 0 的下标 3 有以下可能方案:
下标 0 -> 下标 4 -> 下标 1 -> 下标 3
示例 3:

输入:arr = [3,0,2,1,2], start = 2
输出:false
解释:无法到达值为 0 的下标 1 处。

提示:

1 <= arr.length <= 5 * 10^4
0 <= arr[i] < arr.length
0 <= start < arr.length

思路:不要问问就是暴力,直接深搜,

建立一个vis函数标记每个已经走过的点(每个点只有两种情况,深搜的时候两个情况都会走,所以不需要二次访问),然后递归的时候注意一下i-arr[i]要>0且<arr.size()。

class Solution
{
public:
    bool canReach(vector<int>& arr, int start)
    {
        int n=arr.size();
        bool ans = bfs(arr, start, n);
        return ans;
    }

    bool vis[500010];

    bool bfs(vector<int>& arr,int start, n)
    {
        //printf("%d\n",start);
        if(arr[start] == 0)
        {
            return true;
        }
        else
        {
            vis[start] = true;
            bool flag = false;

            if(start + arr[start] < n && start + arr[start] >= 0 && !vis[start + arr[start]] )
                flag |=  bfs(arr, start + arr[start]);

            if(start - arr[start] < n && start - arr[start] >= 0 && !vis[start - arr[start]] )
                flag |=  bfs(arr, start - arr[start]);

            return flag;
        }
    }
};

原文地址:https://www.cnblogs.com/tijie/p/12132954.html

时间: 2024-10-08 19:07:41

Leetcode 1306. 跳跃游戏 III的相关文章

LeetCode 5297. 跳跃游戏 III Jump Game III

地址 https://leetcode-cn.com/problems/jump-game-iii/submissions/ 题目描述这里有一个非负整数数组 arr,你最开始位于该数组的起始下标 start 处.当你位于下标 i 处时,你可以跳到 i + arr[i] 或者 i - arr[i]. 请你判断自己是否能够跳到对应元素值为 0 的 任意 下标处. 注意,不管是什么情况下,你都无法跳到数组之外. 示例 1: 输入:arr = [4,2,3,0,3,1,2], start = 5 输出:

[leetcode] 55. 跳跃游戏

55. 跳跃游戏 分明就是45. 跳跃游戏 II的缩水版本嘛..??,难度高的版本居然放在了前面,把像我这种有强迫症的必须按照题号刷题的人不放在眼里么... class Solution { public boolean canJump(int[] nums) { return jump(nums) != Integer.MAX_VALUE; } public int jump(int[] nums) { int f[] = new int[nums.length]; if (nums.leng

[Leetcode]44.跳跃游戏Ⅰ&amp;&amp;45.跳跃游戏Ⅱ

跳跃游戏链接 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置. 示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置.但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置. 思路: 如果只是判断能否跳到

LeetCode 45. 跳跃游戏2

给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [2,3,1,1,4]       输出: 2       解释: 跳到最后一个位置的最小跳跃数是 2.       从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置.       说明: 假设你总是可以到达数组的最后一个位置. 来源:力扣(LeetCode)      链接:https

Leetcode 5379. 石子游戏 III(第183场周赛)

题目内容 Alice 和 Bob 用几堆石子在做游戏.几堆石子排成一行,每堆石子都对应一个得分,由数组 stoneValue 给出. Alice 和 Bob 轮流取石子,Alice 总是先开始.在每个玩家的回合中,该玩家可以拿走剩下石子中的的前 1.2 或 3 堆石子 .比赛一直持续到所有石头都被拿走. 每个玩家的最终得分为他所拿到的每堆石子的对应得分之和.每个玩家的初始分数都是 0 .比赛的目标是决出最高分,得分最高的选手将会赢得比赛,比赛也可能会出现平局. 假设 Alice 和 Bob 都采

【LeetCode】跳跃游戏

给定一组非负整数,初始时处于数组的第一位下标 0 的位置,数组的每个元素代表那个位置可以跳跃的最大长度.判断你是否能够到达数组的最后一位下标. e.g. A = [2, 3, 1, 1, 4],返回 true. A = [3, 2, 1, 0, 4],返回 false. 我的想法是递归 1 bool canJump(vector<int>& nums) { 2 return jump(nums, 0); 3 } 4 5 bool jump(vector<int> &

LeetCode 55. 跳跃游戏(Jump Game)

题目描述 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 从位置 0 到 1 跳 1 步, 然后跳 3 步到达最后一个位置. 示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置.但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置. 解题思路 用贪心的思想,从数组第

LeetCode——55. 跳跃游戏

给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置. 示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置.但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置. 动态规划

leetcode——45. 跳跃游戏 II

我真的是超开心了,又做对了!!!!!!而且没走啥弯路!!!!!!! class Solution(object): def jump(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums)<2: return 0 pact=0 i=0 while i<len(nums): if nums[i]>=len(nums)-i-1: pact+=1 retu