当前位置: 首页 > 知识库问答 >
问题:

达到最后一个索引所需的最小步骤数

阳光辉
2023-03-14

给定一个非负整数数组,您最初位于数组的第一个索引处。

数组中的每个元素表示该位置的最大跳跃长度。

您的目标是以最少的跳跃次数达到最后一个索引。

例如:给定数组A=[2,3,1,1,4]

到达最后一个指数的最小跳跃次数为2次。(从索引0跳转1步到1,然后3步到最后一个索引。)

我已经从左到右构建了一个dp[]数组,以便dp[i]指示从arr[0]到达arr[i]所需的最小跳转次数。最后,我们返回dp[n-1]。

我的代码的最坏情况时间复杂度是O(n^2)

这可以在更好的时间复杂度下完成。

本题抄袭自leetcode。

共有3个答案

柳高卓
2023-03-14

我认为,你可以用这些技术来提高计算动态:
你花O(N)来计算当前d[i]。但是你可以用d[j]保持一个集合,其中j=0... i-1。现在你只需要使用二进制搜索来查找:

这样的d[j]是所有(0..i-1)中最小的,并且从j位置i-pos是可到达的。

鲁华茂
2023-03-14

可以使用范围最小段树来解决此问题。段树是一种数据结构,允许您维护值数组,还可以查询数组子段上的聚合操作。更多信息可在此处找到:https://cses.fi/book/book.pdf(第9.3节)

您将在段树中存储值d[i]d[i]是从索引i开始时到达最后一个索引所需的最小步骤数。显然,d[n-1]=0。一般来说:

d[i]=1分钟(d[i 1],…,d[min(n-1,i a[i]))

因此,您可以通过反向计算d中的所有值,并在每个步骤后更新段树。最终的解决方案是d[0]。由于段树的更新和查询都在O(logn)中工作,所以整个算法都在O(nlogn)中工作。

马正初
2023-03-14
int jump(vector<int>& a) {
    int i,j,k,n,jumps,ladder,stairs;
    n = a.size();
    if(n==0 || n==1)return 0;
    jumps = 1, ladder = stairs = a[0];
    for(i = 1; i<n; i++){
        if(i + a[i] > ladder)
        ladder = i+a[i];
        stairs --;
        if(stairs + i >= n-1)
        return jumps;
        if(stairs == 0){
            jumps++;
            stairs = ladder - i;
        }
    }
    return jumps;
}
 类似资料:
  • 11.a. 用户管理 设定 root 账号的密码 在您忘记之前, 请赶紧先输入下面的命令来设置 root 账号的密码: 代码清单 1: 设定 root 账号密码 # passwd 如果您希望 root 可以通过串行终端 (serial console) 登陆, 则将 tts/0 添加到 /etc/security: 代码清单 2: 添加 tts/0 到 /etc/security # echo "

  • 问题是获取和数组中相应的索引,这些索引导致以较小的跳跃结束。例如:将需要s... 我说的跳跃是指跳跃;i、 e需要多少啤酒花。如果您是一个特定的索引,则可以通过该索引中的值进行跳跃。 下面是我在中的实现,它正确地给出了最小的跳转次数,但是我很难用

  • 我知道在Swift 3中,循环的典型C风格发生了一些变化。我一直在努力解决这个问题,但在很多情况下,我似乎比以前编写了更多的代码。也许有人能把我引向正确的方向,因为这就是我想要的: 非常简单的东西。我希望能够获取我所在的索引,并且如果names.count==0,则不运行for循环。一气呵成。 但我在Swift 3中的选择似乎不允许我这样做。我必须做一些类似的事情: 需要在开始时使用if语句,因为

  • 我需要一点帮助来查找字符串中最后一个大写字符的最后一个索引 我一直在使用regex这样做。 它怎么会一直返回-1而不是B的索引7 代码突出显示在下面 有没有人对如何解决这个问题有什么建议?

  • 在最后的章节中我们会向你展示如何部署你的应用到产品环境。你可以使用Heroku来免费托管和部署应用,在学习如何部署React应用的同时也可以了解更多create-react-app的相关特性。 弹出 接下来的步骤和知识对于部署产品环境来说并不是必须的,但我依然想要在这里讲解一下。create-react-app提供了一个特性,既可以保持应用的可扩展性,又可以避免被第三方依赖绑架。被第三方依赖绑架通

  • 问题内容: 因此,假设我有一个大小为10的数组,索引范围为0到9。我在其中添加了一堆元素,并停止在索引6处添加。因此,使用array.length,我可以知道数组的大小为10,但是,如何找到哪个索引包含最后一个值,之后又为空?我是否想进行循环并在index == null处停止? 我通过创建一个动态数组来模拟arraylist,该数组在大小已满时会增长。 Arg,忘了告诉大家,如果数组为int,则