LeetCode—55.跳跃游戏(Jump Game)——分析及代码(C++)

LeetCode—55.跳跃游戏[Jump Game]——分析及代码[C++]

  • 一、题目
  • 二、分析及代码
    • 1. 贪心
      • (1)思路
      • (2)代码(简洁)
      • (3)代码(高效)
      • (4)结果
  • 三、其他

一、题目

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个位置。

示例 1:

输入: [2,3,1,1,4]
输出: true
解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。

示例 2:

输入: [3,2,1,0,4]
输出: false
解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/jump-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 贪心

(1)思路

这题思路非常直观,根据一个明显特性:如果一个位置能够到达,那么这个位置左侧所有位置都能到达。
可以得到解法:在遍历过程中,用一个数记录当前所能到达的最远位置即可。

(2)代码(简洁)

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int maxPosi = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (maxPosi < i)
                return false;
            maxPosi = max(maxPosi, i + nums[i]);
        }
        return true;
    }
};

(3)代码(高效)

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int maxPosi = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (maxPosi < i)
                return false;
            if (maxPosi < i + nums[i])
                maxPosi = i + nums[i];
        }
        return true;
    }
};

(4)结果

(简洁版)
执行用时 :12 ms, 在所有 C++ 提交中击败了 84.28% 的用户;
内存消耗 :9.9 MB;
(高效版)
执行用时 :8 ms, 在所有 C++ 提交中击败了 97.90% 的用户;
内存消耗 :9.8 MB, 在所有 C++ 提交中击败了 85.15% 的用户。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法)