zoukankan      html  css  js  c++  java
  • 【leetcode】Jump Game I & II (hard)

    Jump Game (middle)

    Given an array of non-negative integers, you are initially positioned at the first index of the array.

    Each element in the array represents your maximum jump length at that position.

    Determine if you are able to reach the last index.

    For example:
    A = [2,3,1,1,4], return true.

    A = [3,2,1,0,4], return false.

    思路:开始没反应过来,从后往前记录能否到达 结果超时了

    后来反应过来了 从前向后 记录能够到达的最大位置 最大位置>= n-1 就行了

    bool canJump(int A[], int n) {
        int maxdis = 0;
        for(int i = 0; i < n ; i++)
        {
            if(maxdis < i) break; //如果当前最大位置都到不了i说明改格无法到达
            maxdis = (i + A[i] > maxdis) ? i + A[i] : maxdis;
        }
        return maxdis >= n - 1;
    }

    简化后代码

    bool canJump(int A[], int n) {
        int maxdis = 0;
        for(int i = 0; i < n && maxdis >= i; i++)
        {
            maxdis = (i + A[i] > maxdis) ? i + A[i] : maxdis;
        }
        return maxdis >= n - 1;
    }

    Jump Game II (hard) 没做出来

    Given an array of non-negative integers, you are initially positioned at the first index of the array.

    Each element in the array represents your maximum jump length at that position.

    Your goal is to reach the last index in the minimum number of jumps.

    For example:
    Given array A = [2,3,1,1,4]

    The minimum number of jumps to reach the last index is 2. (Jump 1 step from index 0 to 1, then 3 steps to the last index.)

    思路:我用动态规划做 O(n2)超时了

    //超时
    int jump(int A[], int n) {
        int * dp = (int *)malloc(n * sizeof(int));
        dp[n - 1] = 0;
        for(int i = n - 2; i >= 0; i--)
        {
            dp[i] = n;
            for(int j = i + 1; j <= i + A[i] && j < n; j++)
            {
                dp[i] = (dp[i] < dp[j] + 1) ? dp[i] : dp[j] + 1; 
            }
        }
        return dp[0];
    }

    下面贴上大神们的代码和思路,还没看

    int jump(int A[], int n) {
        if(n == 0){
            return 0;
        }
        int maxReachPos = A[0];
        int curMaxReachPos = A[0];
        int curStep = 1;
        for(int i = 1; i <= min(n, maxReachPos); i++){
            curMaxReachPos = max(curMaxReachPos, i + A[i]);
            if(i == n - 1){
                return curStep;
            }
            if(i == maxReachPos){
                maxReachPos = curMaxReachPos;
                curStep++;
            }
        }
        return 0;
    }

    The variable maxReachPos indicates the farthest reachable position and the variable curMaxReachPos indicates the current farthest reachable position.

    At the very beginning, both maxReachPos and curMaxReachPos are equal to A[0].

    In the For loop, we keep updating curMaxReachPos while i <= maxReachPos. However, if( i == n - 1), we return curStep, which is the minimum step. If i reaches the maxReachPos, we update maxReachPos with curMaxReachPos and increment curStep by one.

    Finally, if we can't reach the end point, just return 0.

    BFS做法

    I try to change this problem to a BFS problem, where nodes in level i are all the nodes that can be reached in i-1th jump. for example. 2 3 1 1 4 , is 2|| 3 1|| 1 4 ||

    clearly, the minimum jump of 4 is 2 since 4 is in level 3. my ac code.

    int jump(int A[], int n) {
         if(n<2)return 0;
         int level=0,currentMax=0,i=0,nextMax=0;
    
         while(currentMax-i+1>0){       //nodes count of current level>0
             level++;
             for(;i<=currentMax;i++){   //traverse current level , and update the max reach of next level
                nextMax=max(nextMax,A[i]+i);
                if(nextMax>=n-1)return level;   // if last element is in level+1,  then the min jump=level 
             }
             currentMax=nextMax;
         }
         return 0;
     }
  • 相关阅读:
    asp.net
    Angualr ng-bind-html样式不加载解决办法
    angualr 单页面跳转(仿weui切换动画)
    很多人再找的6位框输入密码 类似于支付时候的输入密码框
    angual+mui 双栏上拉加载,微信里面禁用默认事件可用,可以防止浏览器回弹效果
    单页面跳转添加返回和跳转动画(仿app) 只对单页面和跳转有用,我用的是angualr,有不会的可以私信问我。
    文字前后对齐
    angual+ mui 导航切换实现上拉加载
    ajax监听上传进度
    Echais 点击legend
  • 原文地址:https://www.cnblogs.com/dplearning/p/4394803.html
Copyright © 2011-2022 走看看