45.跳跃游戏

这回的跳跃游戏是用二维表写的
嗯,比递归强
就是觉得之前的贪心不是很对吧
思路就是找到每一步经历的最小步数然后放到每行的最前面
由于认定【0,0】走了0步所以无法判断数组长度为1的
纵坐标代表当前在的位置,横坐标代表当前的步数,如果跳跃的过程中到了最后的位置,就可以跳出了
上代码
之前想用队列存储各个经历过的坐标,结果发现没啥用,只有当前位置的最小步数是有用的,所以,取消了结构体数组

int jump(int* nums, int numsSize)
{
       
      int max=nums[0],s=0,t=0;
       for(int i=0;i<numsSize;i++)
       {
           if(max<nums[i])
           max=nums[i];
       }
       
       int dp[10000][max+1];
       for(int i=0;i<10000;i++)
       {
           for(int j=0;j<(max+1);j++)
           dp[i][j]=INT_MAX;
       }
       dp[0][0]=0;
       int i=0,m=0,flag=1;
       while(flag==1&&(numsSize)!=1)
       {for(int j=1;j<=nums[i];j++)
       {
           dp[i+j][j]=fmin(dp[j+i][j],dp[i][m]+1);
           if(dp[i+j][j]<dp[i+j][0])
           dp[i+j][0]=dp[i+j][j];
           if((i+j)==(numsSize-1)){flag=0;break;}
       }
       dp[i][m]=-1;
     for(i=0;dp[i][0]==INT_MAX||dp[i][0]==-1;i++);m=0;}
       int min=dp[numsSize-1][0];
       for(int i=0;i<(max+1);i++)
       {
           if(dp[numsSize-1][i]<min)
           min=dp[numsSize-1][i];
       }
        
       return min;
}

再次编辑于2021/4/6
之前用二维数组写发现没什么意义,整道题的实现原理类似于是队列, 按照层序的想法来说的话(只要控制每个位置存进去的是最小的步数就可以)后面位置的数一定要比前面位置的数大的,所以现在前面找到能最先到达最后的点一定是最小的
最先跳的数都是1,把1跳完了之后再跳2
如果是在1那块跳的,跳了一步到了最后的位置,那么这个步数一定比在2跳一步到最后要少
因此找到的话直接就返回

int jump(int* nums, int numsSize)
{
       
      int max=nums[0],s=0,t=0;
       for(int i=0;i<numsSize;i++)
       {
           if(max<nums[i])
           max=nums[i];
       }
       
       int dp[10000];
       for(int i=0;i<10000;i++)
       {
           for(int j=0;j<(max+1);j++)
           dp[i]=INT_MAX;
       }
       dp[0]=0;
       int i=0,m=0,flag=1;
       while(flag==1&&(numsSize)!=1)
       {for(int j=1;j<=nums[i];j++)
       {
           dp[i+j]=fmin(dp[i+j],dp[i]+1);
           if((i+j)==(numsSize-1)){flag=0;break;}
       }
       dp[i]=-1;
     for(i=0;dp[i]==INT_MAX||dp[i]==-1;i++);
     }
       
        return dp[numsSize-1];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值