Lintcode 117. 跳跃游戏 II

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

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

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

public int jump(int[] A) {

    int count = 0;
    int maxPos = 0;
    int lastMaxPos = -1;
    for (int i = 0; i < A.length && maxPos < A.length; i++) {
        if (i + A[i] >= A.length-1){
            count++;
            if (i < maxPos)
                count++;
            break;
        }

        if (i == lastMaxPos){
            count+=2;
        }

        if (maxPos <= i+A[i]){
            lastMaxPos = maxPos;
            maxPos = i+A[i];
        }

    }

    return count;

}

自己的解法非常丑陋并且可读性极差

dalao解法:

public int jump2(int[] A) {
    // write your code here
    if (A == null || A.length == 0) {
        return -1;
    }

    int start = 0, end = 0, jumps = 0;
    while (end < A.length - 1) {
        jumps++;
        int farthest = end;
        for (int i = start; i <= end; i++) {
            farthest = Math.max(farthest, A[i] + i);
        }
        start = end + 1;
        end = farthest;
    }

    return jumps;
}

summary:在jump1的基础上,每个阶段的开始总是在前一阶段的结尾的基础上进行

猜你喜欢

转载自blog.csdn.net/qq_38702697/article/details/82957035