前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >跳跃游戏1&2跳跃游戏2

跳跃游戏1&2跳跃游戏2

作者头像
小飞侠xp
发布2018-08-29 11:40:23
4450
发布2018-08-29 11:40:23
举报
文章被收录于专栏:书山有路勤为径

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。

代码语言:javascript
复制
#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。

代码语言:javascript
复制
#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;
        
        }
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 跳跃游戏2
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档