递归算法流程图|递归详解( 四 )


递归算法流程图|递归详解





所以呢,用了备忘录递归算法,递归树变成光秃秃的树干咯,如下:
递归算法流程图|递归详解



带「备忘录」的递归算法,子问题个数=树节点数=n,解决一个子问题还是O(1),所以「带「备忘录」的递归算法的时间复杂度是O(n)」 。接下来呢,我们用带「备忘录」的递归算法去撸代码,解决这个青蛙跳阶问题的超时问题咯~,代码如下:
public class Solution {    //使用哈希map,充当备忘录的作用    Map<Integer, Integer> tempMap = new HashMap();    public int numWays(int n) {        // n = 0 也算1种        if (n == 0) {            return 1;        }        if (n <= 2) {            return n;        }        //先判断有没计算过,即看看备忘录有没有        if (tempMap.containsKey(n)) {            //备忘录有,即计算过,直接返回            return tempMap.get(n);        } else {            // 备忘录没有,即没有计算过,执行递归计算,并且把结果保存到备忘录map中,对1000000007取余(这个是leetcode题目规定的)            tempMap.put(n, (numWays(n - 1) + numWays(n - 2)) % 1000000007);            return tempMap.get(n);        }    }}去leetcode提交一下,如图,稳了:
递归算法流程图|递归详解