题目
My way
1.暴力解
1 | class Solution { |
2. 记忆化搜索
利用暴力解的递归关系,使用一个数组提前存储好对应的值,然后查询的时候遇到已有的结果则提前跳出。
1 | class Solution { |
3.DP
在思考怎么通过已有的递归中的依赖关系 <=> dp的状态转移方程上去。
发现假如是使用2维DP表的话,是不可成立的,因为一个i值需要对应多个j值,所以无从下手。
官方解
1.记忆化搜索 + 二分查找
在检索位置curPos
+ jumpSize
时候,使用二分搜索来查找位置上是否有石头
1 | public class Solution { |
2.DP
在动态规划方法中,我们会利用散列表 mapmap,对于散列表中的 key:valuekey:value,keykey 表示当前石头的位置,valuevalue 是一个包含 jumpsizejumpsize 的集合,其中每个 jumpsizejumpsize 代表可以通过大小为 jumpysizejumpysize 的一跳到达当前位置。
首先我们对散列表初始化,keykey 为所有石头的位置,除了位置 0 对应的 valuevalue 为包含一个值 0 的集合以外,其余都初始化为空集。接下来,依次遍历每个位置上的石头。对于每个 currentPositioncurrentPosition,遍历 valuevalue 中每个 jumpsizejumpsize,判断位置 currentPosition + newjumpsizecurrentPosition+newjumpsize 是否存在于 mapmap 中,对于每个 jumpsizejumpsize,newjumpsizenewjumpsize 分别为 jumpsize-1jumpsize−1,jumpsizejumpsize,jumpsize+1jumpsize+1。如果找到了,就在对应的 valuevalue 集合里新增 newjumpsizenewjumpsize。重复这个过程直到结束。如果在结束的时候,最后一个位置对应的集合非空,那也就意味着我们可以到达终点,如果还是空集那就意味着不能到达终点。
1 | public class Solution { |
总结
- 暴力递归解总是有的,不过要找出一个靠谱的递归实现,然后可以通过其优化为 用一个数组存好结果的记忆化搜索的方式;
- dp数组可以是 hash散列 这种存储方式,不一定是 数组 的存储方式。