每次爬 1 和 2 n=0 1 n=1 1 n=2 1+1 2 n=3 1+1+1 1+2 2+1 n=4 1+1+1+1 1+1+2 2+1+1 1+2+1 2+2 n=5 1+1+1+1+1 1+2+2 2+1+2 2+2+1 1+1+1+2 2+1+1+1 1+2+1+1 1+1+2+1 f(2) = f(1)+f(0) f(3) = f(2) + f(1) f(4) = f(3) + f(2) f(n) = f(n-1)+f(n-2) 根据推到的公式 编写代码如下:

    1. class Solution {
    2. public int climbStairs(int n) {
    3. //0. 通过递归的方式实现,不推荐 会爆栈
    4. //if(n==1) return 1;
    5. //if(n==2) return 2;
    6. //return climbStairs(n-1) + climbStairs(n-2);
    7. //1. 通过数组的方式保存,但是会占用大量的空间
    8. // int result[] = new int[n+1];//只需要三个空间的数组
    9. // result[0] = 1;
    10. // result[1] = 1;
    11. // for (int i = 2; i <=n; i++) {
    12. // result[i] = result[i-1] + result[i-2];
    13. // }
    14. //f(5) = f(4)->f(3)->f(2)+f(1)+f(2) = 5 + f(3)->f(2)+f(1) = 3
    15. // return result[n];
    16. //3.可以通过滚动DP的方式实现,优化占用的空间
    17. if (n<=2) {
    18. return n;
    19. }
    20. int q = 1;
    21. int p = 2;
    22. int r = 0;
    23. for (int i = 3; i <=n; i++) {
    24. r = q + p;//3
    25. q = p;//2
    26. p = r;//3
    27. }
    28. return r;
    29. }
    30. }