LeetCode 55. Jump Game

55. Jump Game

一、问题描述

Given an array of non-negative integers, you are initially positioned at the first index of the array.

Each element in the array represents your maximum jump length at that position.

Determine if you are able to reach the last index.

二、输入输出

For example:
A = [2,3,1,1,4], return true.

A = [3,2,1,0,4], return false

三、解题思路

这道题在LeetCode上的归类是Greedy(贪心算法)

思路一:倒叙遍历

  • 倒叙遍历。要想走到最后一个,那么前一步至少为1, 记录为minStep 如果想走到n-2 那么n-3至少为1.加入n-2为0,那么n-3至少为2才能越过n-2走到n-1, 这时minStep就加1.如果某个index 条件满足,即nums[index] >= minStep 就说明如果从index这里出发是可以到达终点的,这时候我们就更新minStep=1.表示只需要能走到index就行了。
  • 提交之后打败了大部分人,效率还是可以的。
class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size() == 0 || nums.size() == 1)return true;
        int minStep = 1;
        for (int n = nums.size(), i = n - 2; i >0 ; --i) {
            if(nums[i] >= minStep)minStep = 1;
            else minStep++;
        }
        if(nums[0]>=minStep) return true;
        return false;
    }
};

思路二:贪心算法

  • 既然人家归类到Greedy中,那么肯定还是有贪心算法的。这里有个弯儿,就是nums[index]记录的是最大可以走多少步,那么再这一步具体走多少步那?处理办法就是不用管那么多,假设你从当前路径出发,那么看你贪心最远能走多少,并且记录在全局变量里,不断更新这个值。
  • 如果最远走的超过了数组长度那就说明能走到末尾,否则就不行.
  • 注意,这里的停止条件,不能什么都不管的继续叠加maxReach 如果i >=n 或者 i > maxReach 那么程序就终止了。最后在判断,如果i==n说明遍历到了数组末尾,而没有到maxReach 所以是成功的,否则maxReach比数组长度小,那么i就不会到n-1 就退出for循环了
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int maxReach = 0, i = 0, n;
        for (i = 0, n = nums.size(); i < n && i <= maxReach; ++i) {
            maxReach = max(i + nums[i], maxReach);
        }
        return (i ==n);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值