从正数数组A的索引0开始。从索引i,您可以移动到索引i+x,其中x <= A[i]。目标是找到到达数组末尾所需的最小移动次数。
以下是一个示例:
{ 2 , 4 , 1 , 2 , 3 , 2 , 4 , 2}
如果你每次都尽可能地走得更远,那么你将得到以下结果:
0 , 2 , 3 , 5 , 7
这需要4个步骤。但你可以通过以下方法更快地完成它。
0 , 1 , 4 , 7
这只需要3步。
我想了一会儿,做了我能想到的第一件事,但是思考了几天后,我仍然不知道如何更好地完成它。
以下是我的想法。从数组的末尾开始,并跟踪从某个位置到末尾的最小移动次数。所以对于这个例子,moves[7] = 0
,因为它已经是末尾了。然后moves[6] = 1
,因为到达末尾需要一次移动。我的公式是
moves[i] = 1 + min(moves[i+1], moves[i+2], ... , moves[i+A[i]])
当我到达开头的时候,我知道移动的次数。
所以这是O(n^2),我猜还有更快的方法吧?