跳跃游戏1&2

作者: 徐凯_xp | 来源:发表于2018-03-10 11:50 被阅读3次

LeetCode 55. Jump Game
一个数组存储了非负整型数据,数组中的第i个元素nums[i],代表了可以从数组第i 个位置最多向前跳跃nums[i]步;已知数组各元素的情况下,求是否可以从数组的第0个位置跳跃到数组的最后一个元素的位置?
例如:
nums = [2, 3, 1, 1, 4] ,可以从nums[0] = 2 跳跃至 nums[4] = 4; nums = [3, 2, 1, 0, 4] ,不可以从nums[0] = 3 跳跃至 nums[4] = 4。

贪心规律

若此时处在第i位置,该位置最远可以跳至第j位置(index[i]),故第i位置还可跳至: 第i+1、i+2、...、j-1、j位置;
从第i位应跳至第i+1、i+2、...、j-1、j位中可以跳的更远位置的位置,即 index[i+1]、index[i+2]、...、index[j-1]、index[j]最大的那个!
原因:
假设该位置为x,index[x]最大,故从位置x出发,可以跳至i+1、i+2、...、j-1、j所有 位置可以达到的位置;所以跳至位置x最理想。


算法思路

1.求从第i位置最远可跳至第index[i]位置: 根据从第i位置最远可跳nums[i]步: index[i] = nums[i] + i;
2.初始化:
1)设置变量jump代表当前所处的位置,初始化为0; 2)设置变量max_index代表从第0位置至第jump位置这个过程中,最远可到达的位置,初始化为index[0]。
3.利用jump扫描index数组,直到jump达到index数组尾部或jump超过max_index,扫描过程中, 更新max_index。
4.若最终jump 为数组长度,则返回true,否则返回false。


#include<vector>
class Solution{
public:
    bool canJump(std::vector<int> & nums){
    std::vector<int> index; //最远可以跳至的位置
    for(int i = 0;i<nums.size();i++){
        index.push_back(i+ nums[i]);
    }
    int jump = 0;
    int max_index =index[0];
    while(jump < index.size && jump <= max_index){
        if(max_index < index[jump]){
            max_index = index[jump];
        }
        jump ++;
    }
      if(max_index == index.size()){
          return true;
      }
      return false;
    }
};

跳跃游戏2

LeetCode 45. Jump Game II
一个数组存储了非负整型数据,数组中的第i个元素nums[i],代表了可以从数组第i 个位置最多向前跳跃nums[i]步;已知数组各元素的情况下,确认可以从第0位置跳跃到数组最后一个位置,求最少需要跳跃几次?
例如:
nums = [2, 3, 1, 1, 4] ,从第0位置跳到第1位置,从第1位置跳至最后一个位置。

贪心规律

在到达某点前若一直不跳跃,发现从该点不能跳到更远的地方了,在这之前肯定 有次必要的跳跃!
结论:只有在无法到达更远的位置时,我们才应该选择跳跃,而选择从这之间的哪个位置跳跃?应选择一个可以到达更远位置的位置,跳到这个位置后,再往前跳。

算法思路

1.设置current_max_index为当前可达到的最远位置;
2.设置pre_max_max_index为在遍历各个位置的过程中,各个位置可达到的最远位置;
3.设置jump_min为最少跳跃的次数。
4.利用i遍历nums数组,若i超过current_max_index,jump_min加1,current_max_index = pre_max_max_index
5.遍历过程中,若nums[i]+i (index[i])更大,则更新pre_max_max_index = nums[i] + i。

#include<vetor>
class Solution{
public:
    int jump(std::vector<int> &nums){
        if(nums.size() < 2){
            return 0;
        }
        int current_max_index = nums[0];// 当前可达到的最远位置
        int pre_max_max_index = nums[0];//遍历各个位置过程中,可达到的最远位置
        int jump_min =1 ; 
        for(int i = 1; i< nums.size();i++){
            if(i > current_max_index){ // 若无法再向前移动,才进行跳跃
                jump_min++;
                curren_max_max_index = pre_max_max_index;
            }
            if(pre_max_max_index < num[i] + 1){
                pre_max_max_index = nums[i]+i;
            }
            return jump_min;
        
        }
    }
};

相关文章

  • 跳跃游戏1&2

    LeetCode 55. Jump Game一个数组存储了非负整型数据,数组中的第i个元素nums[i],代表了可...

  • 跳跃游戏2

    【链接】https://nanti.jisuanke.com/t/20【题目】给定一个非负整数数组,假定你的初始位...

  • 跳跃游戏2

    题目要求 给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的...

  • 最少跳跃步数(跳跃游戏2)

    题目 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的...

  • 45.跳跃游戏2

  • [LeetCode]45、跳跃游戏2

    题目描述 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 ...

  • 跳跃游戏

    可以正向扫描数组,记录当前位置可以到达最远的位置,a、游标要小于可以到达最远的位置,否则return false。...

  • 跳跃游戏

    【链接】https://nanti.jisuanke.com/t/18【题目】给定一个非负整数数组,假定你的初始位...

  • 跳跃游戏

    LintCode题目地址给出一个非负整数数组,你最初定位在数组的第一个位置。数组中的每个元素代表你在那个位置可以跳...

  • 跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否...

网友评论

    本文标题:跳跃游戏1&2

    本文链接:https://www.haomeiwen.com/subject/mrtmfftx.html