leetcode 70. Climbing Stairs

题目

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

解析

1,首先我们考虑最简单的情况。如果只有1级台阶,那么显然就只有一种跳法。如果有2级台阶,那就有两种跳法:一种是分两次跳,每次1级;另外一种就是一次跳2级。
2,接着我们再来讨论一般情况。我们把n级台阶时的不同跳法看成是n的函数,记为f(n)。当n>2时,第一次跳的时候就有了两种不同的选择:一是第一次只跳1级,此时跳法数目等于后面剩下的n-1级台阶的跳法数目,即为f(n-1);另外一种选择是第一次跳2级,此时跳法数据等于后面剩下的n-2级台阶的跳法数目,即为f(n-2)。因此n级台阶的不同跳法的总数f(n)=f(n-1)+f(n-2)。分析到这里,我们不难看出这实际上就是斐波那契数列了。

解1(数组)

//采用DP的办法
public class Solution {
   public  int climbStairs(int n) {

      if(n <= 2)  
      {  
         return n;  
      }  
      else  
      {  
          int[] step = new int[n];                    
          step[0] = 1;  
          step[1] = 2;  

          for(int i = 2; i < n; i++)  
          {  
             step[i] = step[i-1] + step[i-2];  
          }  
          return step[n-1];  
      }     
   }
}

解2(迭代)

 public class Solution {
   public  int climbStairs(int n) {

          if(n <= 2)  
          {  
             return n;  
          }  
          else  //两级台阶及以上
          {  
                int a0=0,a1=1,a2=0;
                for(int i=0;i<n;i++)//计算n次
                {
                    a2=a0+a1;
                    a0=a1;
                    a1=a2;
                }
                return a2;
          }     
       }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值