C++跳跃游戏之跳到某个位置所需最少次数(贪心算法)

在这里插入图片描述
实现思路可以用动态规划思想:
以示例为例:设定一个数组表示跳到某个位置所需最少次数,
初始位置能跳跃的最大距离是2,那么是不是从初始位置0到1-2区间跳跃任意位置都只需一次就搞定,也就是dp[0]+1,那么1-2区间为起点跳跃时所能到达的最大位置是4,意味着跳到位置3-4区间所需最少次数等于前面区间最少次数+1即可:
列出动态方程:当前位置所在区间内所有位置所需最少次数=前一区间所需最少次数+1;
在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {
       int remote=0+nums[0];
       vector<int> dp(nums.size());
      dp[0]=0;
       for(int i=1;i<nums.size();i++){//i表示的是区间起始值,也代表了这个区间
        if(remote>=nums.size()-1) remote=nums.size()-1;//超越最后一个位置的时候要防止越界
          int dir=remote;
          for(int j=i;j<=dir;j++){
            dp[j]=dp[i-1]+1;
            remote=max(remote,j+nums[j]);//
          }
         i=dir;//更新区间
       }
       return dp[nums.size()-1];
    }
};

也可以使用贪心的思想正向查找:
设立区间终点位置end和当前区间能跳到的最远位置remote:i就是我们一直行走的过程,当走到当前区间边界的时候,我们就要更新下个区间的边界,同时要开始准备跳跃了,所以步数提前+1,接着进行跳跃到下个区间,在区间行走过程中只要不到达边界就无须跳跃步数无需增加,但是要实时更新下一次的能跳到的最远位置,确定下个区间。
注意:我们的步数是提前+1,所以无需跳到最后一个位置,只要remote大于等于最后一个位置,我们就一定能跳跃到。
在这里插入图片描述

class Solution {
public:
    int jump(vector<int>& nums) {
     int end=0,step=0,len=nums.size();
     int remote=0;
     for(int i=0;i<len-1;i++){
       remote=max(remote,i+nums[i]);
         if(end==i){
         step++;
         end=remote;   
          }        
       }
     return step;
    }
};
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值