一尘不染

面试难题:跳跃游戏

algorithm

跳跃游戏:给定一个数组,从第一个元素开始,然后通过跳跃到达最后一个元素。跳转长度最多可以是数组当前位置的值。最佳结果是当您以最少的跳数达到目标时。

寻找最佳结果的算法是什么?

例如:给定数组A = {2,3,1,1,4},到达末尾(索引列表)的可能方法是

  1. 0,2,3,4(将2跳转到索引2,然后将1跳转到索引3,然后将1跳转到索引4)
  2. 0,1,4(从索引1跳到索引1,然后从索引3跳到索引3)

由于第二个解决方案只有2次跳跃,因此是最佳结果。


阅读 211

收藏
2020-07-28

共1个答案

一尘不染

总览

给定数组a和当前位置的索引i,重复以下操作,直到到达最后一个元素。

考虑所有候选“跳转到元素” a[i+1]a[a[i] + i]。对于索引处的每个此类元素e,请计算v= a[e]+
e。如果元素之一是最后一个元素,请跳到最后一个元素。否则,请跳至带有最大值的元素v

更简单地说,在触及范围内的元素中,寻找一个可以使您在 下一
跳上走得最远的元素。我们知道此选择x正确,因为与y您可以跳转到的其他每个元素相比,从y可以到达的元素是从可以到达的元素的子集x(除了向后跳转的元素,这显然是错误的选择)。

该算法在O(n)中运行,因为每个元素仅需要考虑一次(可以跳过第二次考虑的元素)。

考虑值a,索引i以及index和value之和的数组v

i ->  0   1   2   3   4   5   6   7   8   9  10  11  12
a -> [4, 11,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1]
v ->  4  12   3   4   5   6   7   8   9  10  11  12  13

从索引0开始并考虑接下来的4个元素。找到最大的一个v。该元素位于索引1,因此跳至1。现在考虑接下来的11个元素。目标触手可及,所以跳到目标。

演示版

参见此处此处的代码

2020-07-28