045.Jump Game I & II
虽然是
hard
类的题目,但其实也很简单。不过代码如果想要既美观又高效,可能就要费点功夫了。题目链接: Jump Game, Jump Game II。
原始代码
这个是我写的Jump 2
的代码,Jump 1
和 2的代码基本就是一回事。
思路也比较直接,用max_pos
记录从当前节点开始,可以到达的最远位置(end
或者max_pos
)
若最远位置已经超出长度,那么直接返回就行了。
对于Jump 1
,略微修改下代码,检测step
的长度,如果step
的数量超过数组长度,那么肯定是走重复了。
1 | class Solution { |
可以看到这个代码比较挫,看起来就不够美观,于是到dicuss 看了看别的大佬的答案,感觉打开了新世界的代码..
Jump 2 的简短代码
1 | class Solution { |
比如就是我们题目中的[2,3,1,1,4]。
初始状态是这样的:cur表示最远能覆盖到的地方,用红色表示。
last表示已经覆盖的地方,用箭头表示。它们都指在第一个元素上。
接下来,第一元素告诉cur,最远咱可以走2步。于是:
下一循环中,i指向1(图中的元素3),发现,哦,i小于last能到的范围,于是更新last(相当于说,进入了新的势力范围),步数ret加1.同时要更新cur。因为最远距离发现了。
接下来,i继续前进,发现i在当前的势力范围内,无需更新last和步数ret。更新cur。
i继续前进,接下来发现超过当前势力范围,更新last和步数。cur已然最大了。
最后,i到最后一个元素。依然在势力范围内,遍历完成,返回ret。
Jump 1 的简短代码
本题用一个数 reach 表示能到达的最远下标,一步步走下去,
如果发现在 reach 范围之内某处能达到的范围大于 reach,
那么我们就用更大的范围来替换掉原先的 reach,这样一个局部的最优贪心策略,在全局看来也是最优的
因为 局部能够到达的最大范围也是全局能够到达的最大范围:
1 | class Solution { |
小结
Jump 2 的代码还是蛮神奇的…有点意思.
045.Jump Game I & II