45. 跳跃游戏 II

Posted wangshaowei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了45. 跳跃游戏 II相关的知识,希望对你有一定的参考价值。

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

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

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

示例:

输入: [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
  从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。
说明:

假设你总是可以到达数组的最后一个位置。

解:

对于这道题,最先想到的是动态规划,从后面向前计算,这样就知道前一个的最优步数,不用重复计算。但面对某些测试用例情况下

会显示超时,以下为动态规划的方法

 1 class Solution {
 2 public:
 3     int jump(vector<int>& nums) {
 4         map<int,int> map_index_length;
 5         map_index_length[nums.size()-1]=0;
 6         for(int i=nums.size()-2;i>=0;i--)
 7         {
 8             int best_length=INT_MAX-1;
 9             int step=1;
         //step小于当前大小可以移动距离
10 for(int j=i+1;j<nums.size()&&step<=nums[i];j++,step++) 11 { 12 best_length=min(best_length,map_index_length[j]); 13 } 14 15 map_index_length[i]=best_length+1; 16 17 } 18 return map_index_length[0]; 19 } 20 };

后面看别人解法,因为可以跳跃的步数小于当前数字大小而不是等于,发现此题应该考察的是贪心的方法

只要选择当前范围内最大的能达到的数字跳跃即可(可能有点难理解,比如3,3,2,2,1,2第一步应该选滴4位数2,即范围内nums[i]+i最大的数)

class Solution {
public:
    int jump(vector<int>& nums) {
        //转化问题为找到每个范围内的最大值
        int step=0;
        //记录下一次最长能到的下标
        int maxLength=0;
        //
        int end=0;
        for(int i=0;i<nums.size()-1;i++)
        {
            //寻找可以到的范围内最大的数
            maxLength=max(maxLength,nums[i]+i);
            //当前范围走完,把最大的值当作下一次的目标
            if(i==end)
            {
                end=maxLength;
                step++;
            }
        }
        return step;
    }
}; 

 

以上是关于45. 跳跃游戏 II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 45. 跳跃游戏 II | Python

leetcode 每日一题 45. 跳跃游戏 II

leetcode 每日一题 45. 跳跃游戏 II

Lc45_跳跃游戏II

LeetCode 45. 跳跃游戏 II

java 45.跳跃游戏II(#)。java