• LeetCode


    问题描述:n个台阶,每次只能跨1个或者2个,求有多少种方法。

    ways[i]:i个台阶的方法。可能是由i-1个台阶跨1个或者由i-2个台阶,转化为斐波那契数列,即

    1 int climbStairs(int n)
    2 {
    3     if (n == 1)
    4         return 1;
    5     else if (n == 2)
    6         return 2;
    7     else
    8         return climbStairs(n-1) + climbStairs(n-2);
    9 }

    递归效率太低,重复计算了很多分支,使用动态规划法填表,提高效率,程序也很简单:

     1 class Solution {
     2 public:
     3     int climbStairs(int n) {
     4         int ways[n+1];
     5         ways[1] = 1;
     6         ways[2] = 2;
     7         for (int i = 3; i <= n; i++)
     8         {
     9             ways[i] = ways[i-2] + ways[i-1];
    10         }
    11         return ways[n];
    12     }
    13 };

    还可以采用如下方法节约空间:

     1 class Solution {
     2 public:
     3     int climbStairs(int n) {
     4         int ways[3];
     5         ways[0] = 1;
     6         ways[1] = 1;
     7         for (int i = 2; i <= n; i++)
     8         {
     9             ways[i%3] = ways[(i-2)%3] + ways[(i-1)%3];
    10         }
    11         return ways[n%3];
    12     }
    13 };
  • 相关阅读:
    就业指导【黄春霞】
    百度面试题
    面试题08-多线程网络
    面试题07-内存管理
    面试题06-Foundation
    面试题05-UI控件
    面试题04-应用程序
    面试题03-第三方框架
    面试题02-客户端安全性和框架设计
    面试题01-数据存储
  • 原文地址:https://www.cnblogs.com/bournet/p/4109897.html
Copyright © 2020-2023  润新知