题目描述:
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例:
本题与斐波那契数列问题非常类似。
在要爬n级台阶的情况下,最后一步有且仅有这两种可能:
可能1:最后一步仅上了一级台阶。此时人是站在第n-1阶台阶上向上迈出的最后一步。
可能2:最后一步是登了两级台阶。此时人是站在第n-2阶台阶上向上迈出的最后一步。
对于可能1,我们只要算出人从地面迈上n-1阶台阶的方法数,就是可能1总共的方法数,问题规模从n缩减为n-1。
同样地,对于可能2,我们只要算出人从地面迈上n-2阶台阶的方法数,就是可能2总共的方法数,问题规模从从n缩减为n-2。
因此,从地面迈上n阶台阶的方法数F(n) = F(n-1)+F(n-2)。这和斐波那契非常相似。
再考虑初始条件,只有一个阶梯时只有一种方法,有两个台阶时有(1)一步迈两个台阶和(2)一步一个台阶,迈两次。这两种方法。因此F(1)=1, F(2)=2。
代码:
class Solution {
public:
int climbStairs(int n) {
if(n == 1 || n == 2) return n;
int a = 1;
int b = 2;
for(int i = 3; i < n; i++){
b = a + b;
a = b - a;
}
return a + b;
}
};
该题进阶可查看第746题最小代价爬楼梯
Leetcode746.最小代价爬楼梯
题目描述:
给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例1:
示例2:
提示:
代码如下:
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int n = cost.size();
int a = cost[0];
int b = cost[1];
int min;
for(int i = 2; i < n; i++){
min = a < b ? a : b;
a = b;
b = min + cost[i];
}
return a < b ? a : b;
}
};