• 57. Jump Game && Jump Game II


    Jump Game

    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.

    思路:若能走的最远距离小于当前距离,说明走不过来。否则,利用此位置情况更新最远距离。

    class Solution {
    public:
        bool canJump(int A[], int n) {
            int reached = 0;
            for(int i = 0; i < n; ++i) {
                if(reached < i) return false;
                if(i+A[i] > reached) reached = i+A[i];
            }
            return true;
        }
    };
    

    Jump Game II

     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.)

    思路:

    方法1: 动态规划。(能走到下标为 n-1 位置时,就结束。)

    class Solution {
    public:
        int jump(int A[], int n) {
            if(n == 0) return 0;
            vector<int> step(n, INT_MAX);
            step[0] = 0;
            int reached = 0;
            for(int i = 0; i < n-1; ++i) {
                if(reached < i || step[i] >= step[n-1]) break;
                if(i + A[i] > reached) {
                    reached = i+A[i];
                    for(int j = i+1; j < n && j <= reached; ++j)
                        step[j] = min(step[j], step[i]+1); 
                }
            }
            return step[n-1];
        }
    };
    

     方法二 : 从前往后跳,每一步长内选择选择能跳到下一步长最远的点。 第一个步长为 0 - A[0], 第二步长为 A[0] - max(0+A[0],..., A[0] + A[A[0]]),

    从 0->A[0]->maxA[i](0+A[0],...,A[i] + A[A[i]], ... , A[0] + A[A[0]]);

    class Solution {
    public:
        int jump(int A[], int n) {
            int last = 0, step = 0, maxV = 0;
            for(int i = 0; i < n; ++i) {
                if(i > last) {
                    last = maxV;
                    ++step;
                }
                maxV = max(maxV, i + A[i]);
            }
            return step;
        }
    };
    

     方法三: 从后往前确定应该走的位置。(从前往后遍历,如果 i + A[i] >= last , 说明其第一个能走到最后, 更新 last = i).

    class Solution {
    public:
        int jump(int A[], int n) {
            int last = n-1, step = 0;
            while(last > 0) {
                for(int i = 0; i < last; ++i) {
                    if(i+A[i] >= last) {
                        last = i;
                        step++;
                        break;
                    }
                    else if(i == last) return INT_MAX;
                }
            }
            return step;
        }
    };
    

     附加:以下这个代码也可以 AC. (但是常识上不觉得是对的)

    class Solution {
    public:
        int jump(int A[], int n) {
            int last = n-1, step = 0;
            while(last > 0) {
                for(int i = 0; i < last; ++i) {
                    if(i+A[i] >= last) {
                        last = i;
                        step++;
                    }
                }
            }
            return step;
        }
    };
    
  • 相关阅读:
    Word2010如何从指定页设置页码
    十大常见web漏洞及防范
    CSRF攻击与防御
    信息安全常见漏洞类型汇总
    回忆一次校招笔试的题目
    Python操作rabbitmq系列(三):多个接收端消费消息
    Python操作rabbitmq系列(二):多个接收端消费消息
    Python操作rabbitmq系列(一)
    Python操作Redis
    Python连接Redis
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3961150.html
Copyright © 2020-2023  润新知