leetcode jump-game贪心+dp

题意:
给定一个非负整数数组,您首先被定位在数组的第一个索引处。
数组中的每个元素表示该位置的最大跳跃长度。
确定是否能够到达最后一个索引。
例如:
A=[2,3,1,1,4],返回真。
A=[3,2,1,0,4],返回假。

解题:
定义一个能跳跃达到的最大长度maxlen = A[0]+1
然后遍历A数组
如果最大长度不能跳到当前点i+1,返回false
如果最大长度能达到终点len,返回true
遍历每个点时更新一下maxlen就行

public class Solution {
    public boolean canJump(int[] A) {
        int maxlen = A[0]+1;
        int len = A.length;
        if(len==1)return true;
        for(int i=1;i<len;i++){
            if(maxlen>=len){//最大跳跃距离大于等于终点
                return true;
            }
            else if(i+1>maxlen){//最大跳跃距离到不了第i步
                return false;
            }
            else if(i+1<=maxlen){
                if(1+i+A[i]>maxlen){
                    maxlen = 1+i+A[i];
                }
            }
        }
        return true;
    }
}

jump-game-ii(求跳到终点的最少步数)
给定一个非负整数数组,您首先被定位在数组的第一个索引处。
数组中的每个元素表示该位置的最大跳跃长度。
您的目标是在最小跳跃次数内达到最后一个索引。
例如:
给定数组a=[2,3,1,1,4]
到达最后一个索引的最小跳转数是2。(从索引0跳1步到1,然后跳3步到最后一个索引。)

import java.util.*;
public class Solution {
    public int jump(int[] A) {
        int len = A.length;
        int dp[] = new int[len];
        dp[0]=0;
        for(int i=1;i<len;i++){
            dp[i] = 99999999;
        }
        for(int i=0;i<len;i++){
            if((i+A[i])>=len){
                for(int j=i+1;j<len;j++){
                    dp[j] = Math.min(dp[j],dp[i]+1);
                }
            }
            else{
                for(int j=i+1;j<=i+A[i];j++){
                    dp[j] = Math.min(dp[j],dp[i]+1);
                }
            }
        }
        return dp[len-1];
    }
}

猜你喜欢

转载自blog.csdn.net/victor_socute/article/details/89243470
今日推荐