【Leetcode】之Jump Game II

一.问题描述

iven 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.

Your goal is to reach the last index in the minimum number of jumps.

For example:
Given array A = [2,3,1,1,4]

The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

Note:
You can assume that you can always reach the last index.

二.我的解题思路

拿到题目,最笨的办法就是遍历。但是这样的复杂度肯定是很高的。于是就想其他办法,看看能否利用技巧或者使用经典的算法思想。针对这道题目,比较合适的算法思想就是动态规划和贪心算法。使用动态规划也比较麻烦,贪心算法是最好的选择。但是我对贪心算法的理解不够。

按照我的理解,贪心算法就是每次跳的时候跳到离目标最近的位置,每次只做出当前情形的最优解,而不用考虑是否是全局的最优解。比如拿[2,3,1,1,4]为例,从第一个元素2开始,跳两步之后是离4最近,我理解的贪心策略会做出这样的选择。但是这样做是不对的。

参考了别人的实现代码,别人的程序如下:

class Solution {
public:
    int jump(vector<int>& nums) {
        int n = nums.size();
        int ret = 0;
        int curMax = 0;
        int curRch = 0;
        for(int i = 0; i < n; i ++)
        {
            if(curRch < i)
            {
                ret ++;
                curRch = curMax;
            }
            curMax = max(curMax, nums[i]+i);
        }
        return ret;
    }
};

别人的程序是在贪心策略的基础上加了其他判断,以选取全局最优解。上述程序是对数组进行了一次遍历,记录下以每个位置为起点所能跳到的最远位置。

还是拿[2,3,1,1,4]为例。当i=0时,可以达到的最远位置是nums[2]。按照贪心策略,会跳到nums[2]。但是贪心策略可能是局部最优解。如果从0-2之间的位置出发,可能会跳到更远的距离。所以程序会每次记录判断curMax。
当i=3的时候,i已经超过curr_max了,所以需要再跳一次。加上第一次的跳,一共需要两次跳才能超过3的位置。按照贪心的策略是0-2-3,这样的两次。但是此时的curr_max已经记录了0-1-4这样的两次,这样跳的距离更远,所以会修正到这种跳法。所以最后会找到全局最优解。

这道题给我的启发是:贪心策略可能会达到局部最优解,对有些问题,可以人为的加以判断。记录下其他解的情况,然后对贪心策略进行修正。这道题题目简单,但是做起来确实挺难的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值