zoukankan      html  css  js  c++  java
  • 55. 跳跃游戏

    55. 跳跃游戏

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

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

    判断你是否能够到达最后一个位置。

    示例 1:

    输入: [2,3,1,1,4]
    输出: true
    解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。
    

    示例 2:

    输入: [3,2,1,0,4]
    输出: false
    解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。
    

     方法一:记录达到i位置上的最大剩余步数

    bool canJump(vector<int>& nums) {
           int n=nums.size();
           if(n==0)return false;
           vector<int> dp(n+1,0);
           dp[0]=nums[0];
           if(dp[0]==0&&n>1)return false;
           int tmp=nums[0]-1;
           for(int i=1;i<n;i++){
               dp[i]=max(tmp,nums[i]);
               if(tmp<nums[i])tmp=nums[i];
               tmp--;
               if(dp[i]<=0&&i!=n-1)return false;
               if(dp[i]>=n-i-1)return true;
           }
            return true;
        }

     

    方法二:向前查找是否有可以从j位置到当前i位置的情况( 0<j<i )。

    bool canJump(vector<int>& nums) {
           int n=nums.size();
           bool dp[n+5]={false};
           dp[0]=true;
           for(int i=1;i<n;i++)
           {
               for(int j=i-1;j>=0;j--)
               {
                   if(dp[j]==true&&nums[j]+j>=i)
                   {
                       dp[i]=true;break;
                   }
               }
           }
            return dp[n-1];
        }

     方法三:从后往前逆推,假设可以到达最后位置,找到出发位置。

    bool canJump(vector<int>& nums) {
           int n=nums.size()-1;
           for(int i=n-1;i>=0;i--){
               if(i+nums[i]>=n)
                    n=i;
           }
           return n==0;
        }
  • 相关阅读:
    BFS 简单思想以及代码
    01、Hibernate安装配置
    WireShark——ARP 协议包分析
    eNSP之VLAN设计实验
    eNSP 交换机 路由器 PC 互连设计/实现
    Windows常用的网络命令
    01、Git安装教程(windows)
    Java IO编程——文件拷贝
    Java 多线程编程——多线程
    Java IO编程——转换流
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12717902.html
Copyright © 2011-2022 走看看