/**
* Index: 70
* Title: Climbing Stairs
* Author: ltree98
**/
题意
给定n阶台阶,一次可以跨1阶或2阶,有多少种方法到台阶顶。
注意:
- 给的n一定是正整数
我的
思路
递归的标准题目,注意要记录算过的值,否则会超时。
申请的数组空间为 n+2,是为了避免后面赋值map时候越界情况。
时间复杂度:O(n)
空间复杂度:O(n)
实现
class Solution {
private:
int climb(int *map, int remainder)
{
if(map[remainder] == 0) {
map[remainder] = climb(map, remainder - 1) + climb(map, remainder - 2);
}
return map[remainder];
}
public:
int climbStairs(int n) {
int *map = new int[n+2];
memset(map, 0, (n+2)*sizeof(int));
map[1] = 1;
map[2] = 2;
int ans = climb(map, n);
delete []map;
return ans;
}
};
进阶
思路
用解斐波那契数列的方式,来解这道题。
实现
StefanPochmann
int climbStairs(int n) {
int a = 1, b = 1;
while (n--)
a = (b += a) - a;
return a;
}
liaison
public int climbStairs(int n) {
// base cases
if(n <= 0) return 0;
if(n == 1) return 1;
if(n == 2) return 2;
int one_step_before = 2;
int two_steps_before = 1;
int all_ways = 0;
for(int i=2; i<n; i++){
all_ways = one_step_before + two_steps_before;
two_steps_before = one_step_before;
one_step_before = all_ways;
}
return all_ways;
}