zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    正则表达式
    9.4、分布式进程
    Linux文件编辑工具——VIM
    14 Linux网络管理
    13.Linux系统服务
    12.Linux进程管理
    11.Linux磁盘管理——lvm,raid
    10.Linux磁盘管理
    09.Linux软件包管理——(YUM 、RPM)
    07.Linux 压缩打包
  • 原文地址:https://www.cnblogs.com/bournet/p/4109897.html
Copyright © 2011-2022 走看看