zoukankan      html  css  js  c++  java
  • <leetcode c++>LCP 09. 最小跳跃次数

    LCP 09. 最小跳跃次数

    为了给刷题的同学一些奖励,力扣团队引入了一个弹簧游戏机。游戏机由 N 个特殊弹簧排成一排,编号为 0N-1。初始有一个小球在编号 0 的弹簧处。若小球在编号为 i 的弹簧处,通过按动弹簧,可以选择把小球向右弹射 jump[i] 的距离,或者向左弹射到任意左侧弹簧的位置。也就是说,在编号为 i 弹簧处按动弹簧,小球可以弹向 0i-1 中任意弹簧或者 i+jump[i] 的弹簧(若 i+jump[i]>=N ,则表示小球弹出了机器)。小球位于编号 0 处的弹簧时不能再向左弹。

    为了获得奖励,你需要将小球弹出机器。请求出最少需要按动多少次弹簧,可以将小球从编号 0 弹簧弹出整个机器,即向右越过编号 N-1 的弹簧。

    示例 1:

    输入:jump = [2, 5, 1, 1, 1, 1]

    输出:3

    解释:小 Z 最少需要按动 3 次弹簧,小球依次到达的顺序为 0 -> 2 -> 1 -> 6,最终小球弹出了机器。

    限制:

    • 1 <= jump.length <= 10^6
    • 1 <= jump[i] <= 10000

     这题用动态规划还是很简单的,因为我们能知道的是最后一个位置出发所需要的次数为1,所以我们从后往前遍历。

    dp[i]表示当前位置 i 弹出机器的所需最小位置,由于题目条件说小球在 i 处可以跳往左侧任意位置,所以dp[i]不会 大于 dp[j] + 1 (i < j < n)

    因为当dp[j] < dp[i] + 1 时, (j + 1, n) 位置的 位置跳跃次数一定是 <= dp[j] + 1 不可能大于dp[i] + 1, 所以不用更新

    class Solution {
    public:
        int minJump(vector<int>& jump) {
            int n = jump.size();
            vector<int> dp(n, 1e6);
            for(int i = n - 1; i >= 0; i--){
                dp[i] = i + jump[i] >= n ? 1 : dp[i + jump[i]] + 1;
                for(int j = i + 1; j < n && dp[j] >= dp[i] + 1; j++){
                    dp[j] = dp[i] + 1;
                }
            }
            return dp[0];
        }
    }; 
  • 相关阅读:
    Struts2-1.配置&与第一个应用
    1.rs.first()、rs.last()、rs.next()、rs.getRow()
    网页跳转
    js---DOM元素节点
    4、BufferedIn(out)putStream--->字节输入/输出流的缓冲区类(高效类:高效率读写)
    3、FileInputStream--->类文件输入流(读取文件数据)
    2、FileOutputStream--->文件输出流(向文件写入数据)
    1、IO输入&输出流 简介
    OutOfMemoryError系列
    Spark调优,性能优化
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/14456828.html
Copyright © 2011-2022 走看看