跳跃游戏II

jump-game-ii

http://www.nowcoder.com/questionTerminal/7250845fb3b946a5a778565adba9d993

符合动态规划的条件:

  1. 每个状态与前一个状态有关——设到i的最少步数为f(i),则f(i) = f(i的上一个点) + 1
  2. 初始状态是已知的——刚开始几个点的f与第一个点有关

然后就是实现问题了,两个循环,外循环是遍历每个点,内循环是遍历当前点的“势力范围”。

class Solution {
public:
    /**
     *
     * @param A int整型一维数组
     * @param n int A数组长度
     * @return int整型
     */
    int jump(int *A, int n) {
        // write code here
        // 动态规划:设到i的最少步数为f(i),则f(i) = f(i的上一个点) + 1
        // dp数组保存到第i个点最少的步数
        if (n <= 1) return 0;
        vector<int> dp(n, 0);
        for (int i = 0; i < n; ++i) {
            int maxIdx = min(A[i] + i, n - 1);  // 从i走能到的最大位置
            for (int j = i + 1; j <= maxIdx; ++j) {
                if (dp[j] == 0) dp[j] = dp[i] + 1; // 位置没有被走过,保存最小步数
            }
            if (dp[n - 1] != 0) return dp[n - 1];
        }
        return -1;
    }
};
刷遍天下无敌手 文章被收录于专栏

秋招刷题历程

全部评论

相关推荐

爱吃肉的伊登在写日记:好棒,27届简历能做成这个样子,但是第一个项目感觉cover住难度还是不小的,特别是二面的时候肯定要对分布式系统设计这一块儿有高出正常面试者的水平才行
点赞 评论 收藏
分享
05-23 20:31
已编辑
武汉大学 Java
内向的柠檬精在研究求职打法:注意把武大标粗标大 本地你俩不是乱杀
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务