[Leetcode]_70_Climbing Stairs

/**
 *  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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值