跳跃数组II

原题在这里

  基于能否到达的基础上,增加了最少次数的条件,且保证一定能够到达。

analyse:

   mine——定义dp[i]表示到达下标i最少需要次数

   那么,初始化有int_max(or 数组长度+1),dp[0]=0

   状态转移:

     将dp在num[i]范围j取min值(dp[i]+1,dp[i+j])

code:

复制代码
class Solution
{
public:
    int jump(vector<int> &nums)
    {
        int l = nums.size();
        vector<int> dp(l, 1e4 + 1);
        dp[0] = 0;
        for (int i = 0; i < l; ++i)
            for (int j = 1; i + j < l && j <= nums[i]; ++j)
                dp[i + j] = min(dp[i + j], dp[i] + 1);
        return dp[l - 1];
    }
};
easy
复制代码

这是很容易想到的处理算法,但是不够好,复杂为O(N*num[i])

进阶:

  analyse:

    对于状态num[i],在可达范围内[i,i+num[i]]的step次数一定相同,那么最终在上一个dp的遍历结果呈现阶梯形式

    也就是,只需要维护当前step可以到达的区间范围即可,当到达当前step的max边界时候,step+1,更新max边界

    注意一点是,实际遍历处理不需要遍历到数组最后一个下标

code:

复制代码
class Solution
{
public:
    int jump(vector<int> &nums)
    {
        int n = nums.size(), ans = 0, x = 0, r = 0;
        for (int i = 0; i < n - 1; ++i)
        {
            x = max(x, i + nums[i]);
            if (i == r)
                r = x, ans++;
        }
        return ans;
    }
};
复制代码

 

【Over】

posted @   Renhr  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示