由leetcode中70题联想出为啥他是斐波那契数列的形式

由leetcode中70题联想出为啥他是斐波那契数列的形式

LeetCode70题解题思路

我采用的是递归的方式解出链接LeetCode70题.,代码如下

class Solution {
    HashMap<Integer,Integer> haMap = new HashMap();
    public int climbStairs(int n) {

        /**
         *递归算法(超时)
         
        if(n == 1){
            return 1;
        } else if(n == 2){
            return 2;
        } else {
            return climbStairs(n-1) + climbStairs(n-2);
        }
        */

        /**
         *递归算法(v2)
         *使用HashMap存储已经计算过的值,减少重复计算的结果
         */

         if(n == 1){
             return 1;
         }
         if(n ==2){
             return 2;
         }
         if(haMap.get(n) != null){
             return haMap.get(n);
         }else{
             int result = climbStairs(n-1) + climbStairs(n-2);
             haMap.put(n,result);
             return result;
         }

    }
}

如图
由leetcode中70题联想出为啥他是斐波那契数列的形式_第1张图片

此时绿圈处于黄圈处计算结果一致,又因为6的计算结果是5的计算结果加4的计算结果,所有他是斐波那契数列。
所以我们可以用HashMap将4的结果存起来,当计算5的结果时只需要计算3的结果就可以了。

又由上图结论可以写出如下代码,使用循环的方式实现LeetCode70题的需求。

class Solution {
    public int climbStairs(int n) {

        if(n == 1){
            return 1;
        }
        if(n == 2){
            return 2;
        }

        int subtree = 1;//子树
        int rootNode = 2;//上一个根节点
        int result = 0;

        for(int i = 3;i <= n;i++){

            result = subtree + rootNode;
            subtree = rootNode;
            rootNode = result;

        }
        return result;


    }
}

由此可以延伸出 LeetCode的第509题计算菲波那切数列
代码实现

class Solution {
    public int fib(int n) {

        int subTree = 1;
        int rootNode = 1;
        if(n == 1){
            return subTree;
        }
        if(n == 2){
            return rootNode;
        }

        int result = 0;
        for(int i = 3;i <= n;i++){
            result = subTree + rootNode;
            subTree = rootNode;
            rootNode = result;
        }

        return result;

    }
}

你可能感兴趣的:(leetcode,算法,递归法,java)